Open JuneBuug opened 5 years ago
// setter를 쓰게 되면...
@Setter
public class Study {
private StudyState studyState;
}
@Test pubic void close_Study() { Study study = new Study(); study.setStudyState(StudyState.CLOSE); }
// setter를 안쓰면^^ public class Study { private SutdyState sutdyState;
// 이름에서 어떤 역할을 하는 메서드인지 바로 알 수 있음.
public closeStudy() {
studyState = StudyState.CLOSE;
}
}
@Test pubic void close_Study() { Study study = new Study(); study.closeStudy(); }
### Field Injection이 아닌 Constructor injection을 사용하자.
- 이유
1. DI container에서 관리되는 클래스는 독립적으로 인스턴스화할 수 있는 단순한 POJO → DI 컨테이너를 실행하지 않고도 단위 테스트 가능
→ 그런데 field injection을 하면 모든 빈을 다 띄우고 테스트를 해야해. 왜냐면 해당 클래스를 DI container가 관리해주니까!
2. constructor injection은 필드를 final로 선언할 수 있음. 그렇게 되면 불변객체로 쓸 수 있지만 field injection은 불변객체로 쓸 수없어서 중간에 상태가 바뀔 수도 있음.
```java
// field injection
public class StudyController {
@Autowired
private StudyService studyService;
...
}
// constructor injection
public clss StudyController {
private final StudyService studyService;
public StudyController(StudyService studyService) {
this.studyService = studyService;
}
}
// 이렇게 쓰지말자
public int evenSum() {
...
for (i=0; i < 10; i++) {
if (i % 2 == 0) {
...
}
}
}
생각이 안나서 회사 컨벤션에서 좀 따왔습니다.
[avoid-korean-pronounce]
식별자의 이름을 한글 발음을 영어로 옮겨서 표기하지 않는다. 한국어 고유명사는 예외이다.
나쁜 예 : moohyungJasan (무형자산)
좋은 예 : intangibleAssets (무형자산)
패키지 이름은 소문자를 사용하여 작성한다. 단어별 구문을 위해 언더스코어(_)나 대문자를 섞지 않는다.
메서드명은 기본적으로는 동사로 시작한다. 다른 타입으로 전환하는 메서드나 빌더 패턴을 구현한 클래스의 메서드에는 전치사를 쓸 수 있다.
좋은 예 동사사용 : renderHtml()
전환메서드의 전치사 : toString()
Builder 패턴 적용한 클래스의 메서드의 전치사 : withUserId(String id)
테스트 코드는 api 명세와 같기때문에 알아보기 쉽게 하면 좋을 것 같습니다.
메서드 블럭 범위 이상의 생명 주기를 가지는 변수에는 1글자로 된 이름을 쓰지 않는다. 반복문의 인덱스나 람다 표현식의 파라미터 등 짧은 범위의 임시 변수에는 관례적으로 1글자 변수명을 사용할 수 있다.
L
붙이기long형의 숫자에는 마지막에 대문자 'L’을 붙인다. 소문자 'l’보다 숫자 '1’과의 차이가 커서 가독성이 높아진다.
사족으로 builder 패턴을 쓰는 것에 이견이 없긴합니다만, setter를 고집했던 것은 가독성이 더 좋기때문입니다. lombok 사용하면 builder든 setter 메소드든 보일러플레이트로 가려져버리니 entity 내에서의 가독성은 비슷한데요.
객체를 변형해가면서 테스트해야할 경우 혹은 객체를 여러개 만들어야할 경우.. builder가 껴서 가독성이 흐려지는 경우가 있어서요.
@Test
void 테스트() {
Sth sth = new Sth().setName("이름");
Sth sth2 = new Sth().setName("다른이름");
}
@Test
void 테스트() {
Sth sth = SthBuilder.name("이름").build();
Sth sth2 = SthBuilder.name("이름").build();
}
~더불어 builder 패턴에서는 dao <-> dto converter를 어떻게 사용하는지 궁금합니다.~ (프로젝트에서 안써서 ㅠㅠ) ~저희는 때에 따라 dto에 set해주는 경우도 있고 아닌 경우도 있는데, builder로 dao를 만들면 어떻게 처리하나용?~ : 쓰는 경우가 있어 참고했습니다. dto 에만 setter있으면 상관없겠네요~