Underdogs Coding Convention - woowacourse-teams/2020-devbie GitHub Wiki

Work Flow - Git & Github


1. ๋ธŒ๋žœ์น˜๋ช…

1.1. ๋ธŒ๋žœ์น˜ ๋ช…์€ ์ด์Šˆ ๋ผ๋ฒจ๊ณผ ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋งŒ๋“ ๋‹ค.

  • Branch: feature/#issueNumber-branchName

2. PR ๋ฐ ์ปค๋ฐ‹ ๋‹จ์œ„

2.1. PR๊ณผ ์ปค๋ฐ‹์€ ์ตœ๋Œ€ํ•œ ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐ ๋‹ค.

- 1๊ฐœ์˜ ์ปค๋ฐ‹์—๋Š” 1๊ฐœ์˜ ํ–‰์œ„๋งŒ ๋“ค์–ด ์žˆ๋„๋ก ํ•œ๋‹ค.
- 1๊ฐœ์˜ PR์—๋Š” 1๊ฐœ์˜ ์ž‘์—…๋งŒ ๋“ค์–ด ์žˆ๋„๋ก ํ•œ๋‹ค.

2.2. PR์€ Issue(feature) ๋‹จ์œ„๋กœ, commit์€ ์˜๋ฏธ์žˆ๋Š” ์ž‘์—… ๋‹จ์œ„๋กœ ํ•œ๋‹ค.


3. git flow ์˜ˆ์‹œ

Branches
- develop (๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋œ ๋ธŒ๋žœ์น˜๊ฐ€ ๋จธ์ง€๋˜๋Š” ๋ธŒ๋žœ์น˜)
- feature/2-login_layout (๋กœ๊ทธ์ธ ๋ ˆ์ด์•„์›ƒ ์ž‘์—… branch) // '์ด์Šˆ๋ผ๋ฒจ/์ด์Šˆ๋ฒˆํ˜ธ+์ด์Šˆ์ œ๋ชฉ'
  1. ๋กœ์ปฌ ์ž‘์—…์˜ ์‹œ์ž‘์€ develop ๋ธŒ๋žœ์น˜์—์„œ ํ•œ๋‹ค.

  2. develop ๋ธŒ๋žœ์น˜์—์„œ origin/develop ๋ธŒ๋žœ์น˜๋ฅผ pull ํ•œ๋‹ค. (์›๊ฒฉ ์ €์žฅ์†Œ์™€ ๋™๊ธฐํ™”)

    git pull origin develop
    
  3. develop ๋ธŒ๋žœ์น˜์—์„œ ์ด์Šˆ๋ฒˆํ˜ธ์™€ ์ œ๋ชฉ์œผ๋กœ ์ž‘์—… ๋ธŒ๋žœ์น˜(feature/2-login_layout)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    git checkout -b feature/2-login_layout
    
    • ์ž‘์—… ๋ธŒ๋žœ์น˜์˜ ์ฒซ๋ฒˆ์งธ ํ‚ค์›Œ๋“œ๋Š” ํ•ด๋‹น ์ด์Šˆ์— ํ•ด๋‹นํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ ํ•œ๋‹ค.
      • feature : ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
      • refactor : ๋ฆฌํŒฉํ† ๋ง
      • bugfix : ๋ฒ„๊ทธ ์ˆ˜์ •
      • docs : ๋ฌธ์„œ ์ž‘์—…
  4. ์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

  5. ์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ commitํ•œ๋‹ค.

  6. ๋งŒ์•ฝ ์ปค๋ฐ‹์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์–ด๋ ค ๊ฐœ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค๋ฉด squash๋ฅผ ํ•œ๋‹ค. (์ปค๋ฐ‹ 2๊ฐœ๋ฅผ ํ•ฉ์ณ์•ผ ํ•œ๋‹ค๋ฉด)

  7. ์ž‘์—… ๋ธŒ๋žœ์น˜๋ฅผ origin์— pushํ•œ๋‹ค.

    git push origin feature/2-login_layout
    
  8. Github์—์„œ feature/2-login_layout ๋ธŒ๋žœ์น˜๋ฅผ develop์— mergeํ•˜๋Š” Pull Request๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    • ๋งŒ์•ฝ ์ถฉ๋Œ์ด ๋‚˜์„œ PR์„ ๋ณด๋‚ผ ์ˆ˜ ์—†๋‹ค๋ฉด ๋กœ์ปฌ์˜ ์ž‘์—… ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„์™€ 1๋ฒˆ์—์„œ ํ–ˆ๋˜ ์ž‘์—…์„ ํ•ด์ค€๋‹ค.
    • ์›๊ฒฉ ์ €์žฅ์†Œ์™€ ๋™๊ธฐํ™”
    git pull origin develop // ์ถฉ๋Œ ๋‚˜๋ฉด ํ•ด๊ฒฐ ํ›„ add,commit
    
  9. ๊ฐ™์€ feature๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋™๋ฃŒ์—๊ฒŒ ๋ฆฌ๋ทฐ ์Šน์ธ์„ ๋ฐ›์€ ํ›„ ์ž์‹ ์˜ Pull Request๋ฅผ mergeํ•œ๋‹ค.

  10. merge๋œ ๋ธŒ๋žœ์น˜๋Š” ์‚ญ์ œํ•œ๋‹ค. (local, upstream)

    git branch -D feature/2-login_layout
    
  11. 1๋ฒˆ ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ฐ˜๋ณต


4. ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜

  • docs: ๋ฌธ์„œ ์ž‘์„ฑ ๋ฐ ์ˆ˜์ •
  • feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํฌํ•จ)
  • fix: ๋ฒ„๊ทธ ์ˆ˜์ •
  • perf: ์„ฑ๋Šฅ ๊ฐœ์„ 
  • refactor: ๋ฆฌํŒฉํ† ๋ง โ†’ feat(์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€), fix(๋ฒ„๊ทธ ์ˆ˜์ •) ์ œ์™ธ
  • style: ์ฝ”๋“œ ํฌ๋งท, ๋””์ž์ธ ๋ณ€๊ฒฝ (white-space, formatting, missing semi-colons, etc)
  • test: ๊ธฐ์กด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ • ๋˜๋Š” ๋นผ๋จน์€ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ (Adding missing tests or correcting existing tests)
  • build: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
  • ci: Changes to our CI configuration files and scripts (example scopes: Circle, BrowserStack, SauceLabs)

์ฐธ๊ณ  - Angular Commit Format


AWS ๋ฐฐํฌ ์„œ๋ฒ„

  • EC2
  • master : ๋ณด์Šค๋… ๊ณ„์ •
  • develop : ์†Œ๋‹ˆ ๊ณ„์ •

์ฝ”๋”ฉ ์Šคํƒ€์ผ

1. Frontend

1.1. ESLint

  • eslint-config-vue ํŒจํ‚ค์ง€๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฆ„ vue style guide

1.2. Prettier

  • arrowParens : avoid

1.3. ์ถ”๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ

  • "no-loops" : ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ ์‹œ, ๊ฒฝ๊ณ ๋ฅผ ๋„์šด๋‹ค.

1.4. ์ปค์Šคํ…€ ์Šคํƒ€์ผ ๊ทœ์น™

  • vue hook ๊ณผ ์—ฐ๊ด€๋œ ํ•จ์ˆ˜๋“ค์€, es5 ๋ฒ„์ „์„ ์ ์šฉํ•œ๋‹ค. funtion() { ... }
  • Lambda์˜ ๊ฒฝ์šฐ๋Š” arrow function์„ ์‚ฌ์šฉํ•œ๋‹ค.

2. Backend


Backend - ์ž๋ฐ”/Spring

1. configuration

  • ์„œ๋ฒ„ ํฌํŠธ๋Š” 9000์œผ๋กœํ•œ๋‹ค.
  • ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜๋Š” api url์€ prefix๋กœ /api/~ ๋ฅผ ๋ถ™์ธ๋‹ค.

2. ์ธ์ฆ/์ธ๊ฐ€

2.1. Oauth ์•ฑ์€ Github์œผ๋กœ ํ•œ๋‹ค.

2.2. client_id์™€ client_secret๋Š” application-admin.yml์— ๋†“๊ณ  ์›๊ฒฉ ์ €์žฅ์†Œ์—๋Š” ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

2.3. JwtToken์˜ Payload์—๋Š” user์˜ id ๊ฐ’๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

2.4. ์ธ์ฆ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

์ธ์ฆ ํ”„๋กœ์„ธ์Šค

  1. server๋กœ Github Login url์„ ์š”์ฒญํ•œ๋‹ค. (https://github.com/login/oauth/authorize?client_id=client_id")
  2. Github์—์„œ ์ธ์ฆ ๋ฐ›์€ ํ›„, redirect url๋กœ ์ด๋™ํ•œ๋‹ค. (http://localhost:8080/login)
  3. code๊ฐ’์„ ํฌํ•จํ•˜์—ฌ server๋กœ ๋กœ๊ทธ์ธ ์š”์ฒญ(post)์„ ๋ณด๋‚ธ๋‹ค. (http://localhost:8080/api/oauth/login)
  4. ์ „๋‹ฌ๋ฐ›์€ code๊ฐ’๊ณผ client_id, cliendt_secret์„ ํฌํ•จํ•˜์—ฌ server๋‹จ์—์„œ Github๋กœ ๋น„๋™๊ธฐ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. (https://github.com/login/oauth/access_token)
  5. Github์œผ๋กœ๋ถ€ํ„ฐ access_token์„ ์ „๋‹ฌ๋ฐ›๊ณ , ํ† ํฐ์„ ์‚ฌ์šฉํ•ด์„œ userInfo๋ฅผ ์กฐํšŒํ•œ๋‹ค. (https://api.github.com/user)

3. ์˜ˆ์™ธ์ฒ˜๋ฆฌ

3.1. ์ตœ์ƒ์œ„ ์ปค์Šคํ…€ ์˜ˆ์™ธ ํด๋ž˜์Šค๋Š” RuntimeException์„ ์ƒ์†๋ฐ›๋Š”๋‹ค.

3.2. Error Message๋Š” ํด๋ž˜์Šค ์•ˆ์— ์ •์˜ํ•œ๋‹ค.

public class UnderdogsCustomException() extends RuntimeException {
    
    public UnderdogsCustomException() {
        super("์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");
    }
}

4. Lombok

4.1. ์–ด๋…ธํ…Œ์ด์…˜์€ ์ค‘์š”๋„ ์ˆœ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ์ค‘์š”๋„ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • spring annotaion
  • jpa annotation
    • entity
    • embeddable
    • table
    • ์ค‘์š”๋„ ์Šค์Šค๋กœ ํŒ๋‹จ
  • lombok annotaion
    • contstructor(no -> required -> all)
    • builder
    • getter
    • setter
    • toString
    • EqualsAndHashCode
  • controller, service: RequiredArgsConstructor
  • request_dto
    • NoArgsConstructor(access = PROTECTED)
    • AllArgsConstructor(access = PRIVATE)
    • static factory method
    • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ๋Š” builder ์‚ฌ์šฉ
  • response_dto
    • NoArgsConstructor(access = PROTECTED)
    • AllArgsConstructor(access = PRIVATE)
    • static factory method
    • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ๋Š” builder ์‚ฌ์šฉ
@Entity
@NoArgsConstructor(access = ACCESSOR.PROTECTED)
@Builder
@Getter
@ToString
public class AbcEntity {
    ...
}

5. ๋งค๊ฐœ๋ณ€์ˆ˜

5.1. ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” 3๊ฐœ๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค. (3๊ฐœ๊นŒ์ง€ ํ—ˆ์šฉ)

5.2. ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ธธ ๊ฒฝ์šฐ ๋‹ค์Œ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ค„์„ ๋ฐ”๊ฟ” ํฌ๋งคํŒ…ํ•ด์ค€๋‹ค.

@GetMapping("/{id}")
public ResponseEntity<RoomResponse> getFilterdRoom(
    @PathVariable("id") Long id,
    @RequestBody RoomRequest request
) {
    ...
    
}

6. ํด๋ž˜์Šค ํŒจํ‚ค์ง€

6.1. ์ตœ๋Œ€ํ•œ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„ ๋ฐฉ์‹์„ ๋”ฐ๋ฅธ๋‹ค.

  underdogs.devbie
   |
   |
   |-auth
   |   |--controller
   |   |--service
   |   |--oauth
   |
   |-user
   |   |--controller
   |   |--service
   |   |--domain
  
    ...

6.2. exception, dto ํŒจํ‚ค์ง€๋Š” ๊ฐ aggregate ๋ณ„๋กœ ํ•˜์œ„์— ์œ„์น˜ํ•œ๋‹ค.

  underdogs.devbie
   |
   | ...
   |
   |-user
   |   |--controller
   |   |--service
   |   |--domain
   |   |--exception   **
   |   |--dto         ** 
  
     ...

6.3. config ํŒจํ‚ค์ง€๋Š” root ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•œ๋‹ค.


7. ๋””๋ฏธํ„ฐ์˜ ๋ฒ•์น™ (.)

7.1. ๊ฐ์ฒด๊ฐ„ get ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ์‡„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

7.2. ๊ฐ ๊ฐ์ฒด๊ฐ€ ์Šค์Šค๋กœ ์ผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์‹œ์ง€๋ฅผ ๋˜์ง€๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

  (x) Station station = line.getLineStations().getStation();
      station.updateName("abcd");
    
  (o) lineStation.updateStationName("abcd");

8. ๋žŒ๋‹ค์‹ ํ‘œํ˜„

8.1. ๋ฆฌํ„ดํ•˜๋Š” ๋ณ€์ˆ˜๋ช…๊ณผ ๋žŒ๋‹ค์‹์— ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๋ช…์ด ๊ฒน์น  ๊ฑฐ๋‚˜, ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋ณ€์ˆ˜์ผ ๊ฒฝ์šฐ ํ•œ ๊ธ€์ž๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.

  User user = userRepository.findByOAuthId(userInfoResponse.getId())
                .map(u -> u.updateOAuthInfo(userInfoResponse))
                .orElse(userInfoResponse.toEntity());

9. JPA

9.1. ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋Š” JpaRepository๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

9.2. @repository ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.

9.3. spring data jpa์˜ name function์„ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” Entity์˜ field๋ช…์„ ๋ฐ˜๋“œ์‹œ camel case๋กœ ์ž‘์„ฑํ•œ๋‹ค.

(x) private String oAuthId;

(o) private String oauthId;


10. ๋กœ๊น…

10.1. ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋  ๋•Œ ๋กœ๊น…ํ•œ๋‹ค.

  • ๊ฐ๊ฐ์€ ๋‹ค์Œ ๋‚ด์šฉ์„ ํฌํ•จํ•œ๋‹ค.
  • controller : className, methodName, httpMethod parameters, logTime, requestUri
  • service : className, methodName, parameters, logTime
[INFO ] 2020-07-29 20:38:52.092 [http-nio-auto-1-exec-8] ServiceLoggingAspect - params : {method=saveWithoutOAuthId, service=UserService, params=[UserCreateRequest([email protected])], log_time=2020-07-29T20:38:52.092+0900}
[INFO ] 2020-07-29 20:38:52.095 [http-nio-auto-1-exec-8] ControllerLoggingAspect - params : {controller=UserController, http_method=POST, method=saveUser, params={}, log_time=2020-07-29T20:38:52.095+0900, request_uri=/api/users}

11. API ๋ฌธ์„œ

11.1. **Spring REST Docs**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

11.2. API์— ํฌํ•จ๋˜๋Š” ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


ํ…Œ์ŠคํŠธ

1. DisplayName

1.1. DiplayName์€ ์„œ์ˆ ํ˜•์ด ์•„๋‹Œ ๊ฐœ๊ด„์‹์œผ๋กœ ์ ๋Š”๋‹ค.

x - @DisplayName("jwt ํ† ํฐ ์ƒ์„ฑํ•œ๋‹ค.")  

o - @DisplayName("jwt ํ† ํฐ ์ƒ์„ฑ")

1.2. DisplayName ์–ด๋…ธํ…Œ์ด์…˜์€ ๊ฐ€๋…์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๊ฐ€์žฅ ์ƒ๋‹จ์— ์œ„์น˜ํ•œ๋‹ค. (๋‚˜๋จธ์ง€ ์–ด๋…ธํ…Œ์ด์…˜์€ ์œ„์—์„œ ๋ถ€ํ„ฐ ์ค‘์š”๋„ ์ˆœ์œผ๋กœ ๋‚˜์—ดํ•œ๋‹ค.)

@DisplayName("abc ํ…Œ์ŠคํŠธ")
@Test
void abcTest() {
...
}

2. Annotation

2.1. Controller Test๋Š” @WebMvcTest๋ฅผ ํ†ตํ•ด์„œ ํ•œ๋‹ค.

2.2. Service๋Š” MockitoExtension์„ ์‚ฌ์šฉํ•˜์—ฌ Mock Test๋ฅผ ์ ์šฉํ•œ๋‹ค.


3. Mockito

3.1. BDD mockito style์„ ๋”ฐ๋ฅธ๋‹ค.

@DisplayName("abc ํ…Œ์ŠคํŠธ")
@Test
void abcTest() {
    given(~~).willReturn(~~)
}

3.2. any()๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํƒ€์ž…์ด ๋ช…์‹œ๋œ ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • anyString(), anyLong() ...

3.3. @MockBean vs @Mock

  • controller์—์„œ service๋ฅผ Mock์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” @MockBean์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • service ํ˜น์€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ Mock ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” @Mock์„ ์‚ฌ์šฉํ•œ๋‹ค.

4. ํŒจํ‚ค์ง€ ํ…Œ์ŠคํŠธ

4.1. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š๋Š”๋‹ค.

4.2. Domain ์˜์—ญ์€ TDD๋กœ ๊ตฌํ˜„ํ•˜๋˜ Instruction coverage๊ฐ€ 80%์ด์ƒ์ด ๋˜๋„๋ก ํ•œ๋‹ค. (Jacoco ์„ค์ •)

  • ์ถ”ํ›„ ์ˆ˜์ •

5. ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜

5.1. ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜๋Š” ๋˜๋„๋ก ํ•ด๋‹น ๋ฉ”์„œ๋“œ ์•ˆ์— ์ž‘์„ฑํ•œ๋‹ค.

  • ์ค‘๋ณต๋˜๋Š” ํ”ฝ์Šค์ฒ˜๊ฐ€ ๊ณผํ•˜๊ฒŒ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ์—๋งŒ, @BeforeEach๋กœ ์ถ”์ถœํ•œ๋‹ค.

6. AssertJ

6.1. ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ์†์„ฑ๋งŒ ํ…Œ์ŠคํŠธํ•œ๋‹ค.

  • ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ์†์„ฑ์„ ํ•œ๋ฒˆ์— ๊ฒ€์ฆํ•  ๊ฒฝ์šฐ assertAll()์„ ์‚ฌ์šฉํ•œ๋‹ค.
@DisplayName("abc ํ…Œ์ŠคํŠธ")
@Test
void abcTest() {
    assertAll(
            () -> assertEquals(1L, user.getId()),
            () -> assertEquals(TEST_OAUTH_ID, user.getOauthId()),
            () -> assertEquals(TEST_USER_EMAIL, user.getEmail())
        );
}