서버의 주요 역할을 비즈니스 로직의 처리이다. 이런 비즈니스 로직을 처리하기 위해 백엔드 서버에서는 일반적으로 Controller, Service, Repository, Domain 등을 사용한다. 이름이 다르더라도 유사한 역할을 하는 것들을 사용한다. MyBatis를 사용한다면 Repository를 쓰지 않고 Mapper를 사용할 수 있는 것이 그것이다.

스프링을 처음 배울 때 서비스의 메소드와 레파지토리의 메소드 명을 똑같게 사용했다. 예를 들어 유저의 상세를 조회한다면, 둘다 selectOne을 사용한다던가 유저 목록을 조회하면 selectList를 사용한다던가 했다.
기능은 비슷할 수 있어도 역할이 명확히 다르다. 그렇기 때문에 메소드 네이밍도 달라져야한다.
내 생각도 이게 맞다. ServiceLayer는 비즈니스 로직 처리를 하는 곳이니 Repository와 같을 수 없고, 기능이 똑같더라도 내부 처리 과정과 목적이 애초에 다르기 때문에 네이밍도 다르게 하는 것이 맞다.
나만 몰랐던 이야기일 수도 있지만.,. 그걸 적는 게 TIL이니까.. 부끄럽지만 당당하게 ..,
두 라이브러리는 import부터 매우 유사하다.
assertJ : org.assertj.core.api.Assertions
junit : org.junit.jupiter.api.Assertions
아래 코드는 내가 잠깐이지만 사용했던 메소드이다.
assertJ : assertThat(원본).isEqualsTo(예상결과)
junit : assertEquals(예상결과, 원본)
위 두 가지 클린코드의 나름 법칙(?) 같은 것을 기준으로 생각해보면 assertJ가 조금 더 나은 것 같다. 난 아직 써보지 않았지만 컬렉션을 다룰 때도 assertJ가 좀 더 많은 테스트 도구를 지원한다고 한다. 정확한 이야기는 나중에 따로 블로그에 정리해야 될 것 같다.
Optional<Member>
이건 Member 사용자 정의 타입 변수를 다루기 위한 OptionalType이다. 이걸 이용하면 Null인지 아닌지 부터 filter,map 등 다양한 Optional메소드를 지원해준다. 이렇게 쓰면 try-catch를 쓴다거나 따로 null체크 하는 코드를 작성하지 않아도 되기 때문에 아주 반가운 친구다. 이 친구도 나중에 따로 블로그 글로 다뤄봐야겠다.