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) // '์ด์๋ผ๋ฒจ/์ด์๋ฒํธ+์ด์์ ๋ชฉ'
-
๋ก์ปฌ ์์ ์ ์์์ develop ๋ธ๋์น์์ ํ๋ค.
-
develop ๋ธ๋์น์์ origin/develop ๋ธ๋์น๋ฅผ pull ํ๋ค. (์๊ฒฉ ์ ์ฅ์์ ๋๊ธฐํ)
git pull origin develop
-
develop ๋ธ๋์น์์ ์ด์๋ฒํธ์ ์ ๋ชฉ์ผ๋ก ์์ ๋ธ๋์น(feature/2-login_layout)๋ฅผ ์์ฑํ๋ค.
git checkout -b feature/2-login_layout
- ์์
๋ธ๋์น์
์ฒซ๋ฒ์งธ ํค์๋
๋ ํด๋น ์ด์์ ํด๋นํ๋ ํค์๋๋ก ํ๋ค.feature
: ๊ธฐ๋ฅ ๊ฐ๋ฐrefactor
: ๋ฆฌํฉํ ๋งbugfix
: ๋ฒ๊ทธ ์์ docs
: ๋ฌธ์ ์์
- ์์
๋ธ๋์น์
-
์์ ๋ธ๋์น์์ ์์ค์ฝ๋๋ฅผ ์์ ํ๋ค.
-
์์ ๋ธ๋์น์์ ๋ณ๊ฒฝ์ฌํญ์ commitํ๋ค.
-
๋ง์ฝ ์ปค๋ฐ์ด ๋ถํ์ํ๊ฒ ์ด๋ ค ๊ฐ๋ก ๋๋์ด์ ธ ์๋ค๋ฉด squash๋ฅผ ํ๋ค. (์ปค๋ฐ 2๊ฐ๋ฅผ ํฉ์ณ์ผ ํ๋ค๋ฉด)
-
์์ ๋ธ๋์น๋ฅผ origin์ pushํ๋ค.
git push origin feature/2-login_layout
-
Github์์ feature/2-login_layout ๋ธ๋์น๋ฅผ develop์ mergeํ๋ Pull Request๋ฅผ ์์ฑํ๋ค.
- ๋ง์ฝ ์ถฉ๋์ด ๋์ PR์ ๋ณด๋ผ ์ ์๋ค๋ฉด ๋ก์ปฌ์ ์์ ๋ธ๋์น๋ก ๋์์ 1๋ฒ์์ ํ๋ ์์ ์ ํด์ค๋ค.
- ์๊ฒฉ ์ ์ฅ์์ ๋๊ธฐํ
git pull origin develop // ์ถฉ๋ ๋๋ฉด ํด๊ฒฐ ํ add,commit
-
๊ฐ์ feature๋ฅผ ๊ฐ๋ฐํ๋ ๋๋ฃ์๊ฒ ๋ฆฌ๋ทฐ ์น์ธ์ ๋ฐ์ ํ ์์ ์ Pull Request๋ฅผ mergeํ๋ค.
-
merge๋ ๋ธ๋์น๋ ์ญ์ ํ๋ค. (local, upstream)
git branch -D feature/2-login_layout
-
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
- ๋ค์ด๋ฒ ํต๋ฐ์ด ์ฝ๋ฉ ์ปจ๋ฒค์ ์คํ์ผ์ ๋ฐ๋ฅธ๋ค.
- ๋จ, tab character๋ ์ฌ์ฉํ์ง ์๋๋ค.
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. ์ธ์ฆ ํ๋ก์ธ์ค๋ ๋ค์ ์์๋ฅผ ๋ฐ๋ฅธ๋ค.
์ธ์ฆ ํ๋ก์ธ์ค
- server๋ก Github Login url์ ์์ฒญํ๋ค. (https://github.com/login/oauth/authorize?client_id=client_id")
- Github์์ ์ธ์ฆ ๋ฐ์ ํ, redirect url๋ก ์ด๋ํ๋ค. (http://localhost:8080/login)
- code๊ฐ์ ํฌํจํ์ฌ server๋ก ๋ก๊ทธ์ธ ์์ฒญ(post)์ ๋ณด๋ธ๋ค. (http://localhost:8080/api/oauth/login)
- ์ ๋ฌ๋ฐ์ code๊ฐ๊ณผ client_id, cliendt_secret์ ํฌํจํ์ฌ server๋จ์์ Github๋ก ๋น๋๊ธฐ ์์ฒญ์ ๋ณด๋ธ๋ค. (https://github.com/login/oauth/access_token)
- 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 ๋ฌธ์
Spring REST Docs**๋ฅผ ์ฌ์ฉํ๋ค.
11.1. **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())
);
}