조회 메서드 네이밍 질문
24
작성한 질문수 12
안녕하세요. 요새 조회 메서드 네이밍 컨벤션에 대해 고민 중인데요.
Repository 계층을 제외한 애플리케이션, 도메인 등 계층에서 조회(DB 조회 아닌 경우도 포함) 관련 메서드 명를 작성할 때 네이밍 컨벤션에 대해 고민 중입니다. find를 쓰자니 Spring Data 관례인거 같아 이외 계층에서도 꼭 이렇게 사용할 필요가 있을거 같기도 해서 어떤 방식이 좋을지 조언을 듣고 싶습니다.
현재 생각 중인 3가지 네이밍이에요. 앞에 있는게 데이터가 없을시 예외가 발생하는거고, 뒤에가 없으면 null(또는 Optional) 반환입니다.
get / find
getOrThrow / get
get / getOrNull
답변 1
0
아주 여러운 질문을 주셨네요. 🙂
좋은 네이밍을 만드는 정답은 없습니다. 데이터가 없을 때 예외 발생을 하거나 null을 리턴하게 하는 것을 구분하기 위해서 오래전에 Hibernate는 get, find 같은 방식으로 이름을 주어서 구분하기도 했는데요. 사실 이 단어가 직관적으로 이해될 수 있는 것이 아니기 때문에 매번 정확히 정의를 기억하고 있지 않으면 네이밍은 아무런 도움이 되지 않는 다는 것이 사실입니다.
자바에는 이제는 다음과 같은 규칙을 따르는 것이 권장됩니다.
단일 데이터를 조회하는 메소드인데 데이터가 없는 경우가 있을 수 있고, 그때도 예외없이 리턴을 해야 한다면 Optional 타입을 리턴하게 합니다. 이때는 메소드 이름이 아니라 리턴 타입을 기준으로 어떻게 동작하는 메소드인지 판단할 수 있습니다. NPE 문제 등으로 인해서 Optional이 나온 뒤에는 null을 리턴하는 방식은, 리턴값을 null 여부와 상관없이 단순 저장하는 경우가 아니라면 사용하지 않는 것이 권장됩니다.
데이터가 없을 수도 있는데 있을 때는 하나 또는 여러개라면 List를 사용합니다. 사이즈를 보면 데이터가 없는 경우도 쉽게 파악할 수 있기 때문에 이 방식이 많이 사용됩니다.
데이터가 없을 때는 예외가 발생할 수 있다면 권장되는 방식은 예외를 선언하는 것입니다. throws NoSuchElementException을 불여주는 것이 좋습니다. 이건 메소드가 데이터를 리턴하는 것이 원칙인데, 파라미터가 바르지 않기 때문에 데이터를 가져오지 못하는 경우, 개발자에게 경고를 주기 위해서 예외를 발생시키는 것입니다. 정상 케이스에서는 항상 데이터를 리턴하도록 설계된 조회에서는 사용하지 않는 것이 좋습니다.
그렇다면 메소드 이름을 만드는 것은 어떤 규칙을 쓰는 게 좋은가를 생각해보면, 이것은 철저히 취향 또는 결정의 문제입니다. 조회하는데 add, update로 시작하는 메소드를 쓰지는 않겠죠. 아마도 get, find 등을 많이 사용할 겁니다. 어떤 것이든 사실 아무 상관이 없습니다. 지켜야할 규칙은 일관성이 있어야 한다는 것입니다. 여기저기서 다른 동사로 시작하는 메소드를 쓰면 코드를 읽을 때 혼란이 생길 수도 있겠죠.
OrNull, OrElseThrow 등의 접미사를 쓰는 방식은 자바에서도 Optional 쪽에서만 사용하는, 그 기술을 만든 전문가 그룹의 취향이 반영된 방식인데요. 매번 이런 스타일을 메소드 이름에 적용하는 것은 별로 바람직하지 않습니다. 우리가 코드를 볼 때 주요 로직의 흐름을 빠르게 파악하는 것이 중요한데 이런게 많이 붙어 있으면 시선을 뺐기고 인지부하가 걸릴 뿐이죠.
어떤 선택이든 상관없습니다만 메소드 설계는 가능한 자바의 최신 관례를 따르는 것이 좋고, 메소드 이름은 일관성을 지키는 선에서 간결하게 만드는 것이 바람직합니다.
aws 계정 생성 질문
1
10
0
Tasklet 배치 관련 내용
0
9
1
소스파일
0
30
1
강의 판서 자료
0
26
2
모의고사 파일오류
0
56
3
Properties 설정이 추가되었는데
0
27
1
아무 수정도 안하고 주어진 소스로 그대로 했는데 패스워드 에러가 남
1
46
1
[환불 승인 요청] 강의 오결제 및 재구매 관련 문의드립니다.
0
37
1
처음 실행 시 계속 패스워드가 틀리다고 나옴. 수정하고 해도 마찬가지임
1
54
2
모의고사 다운
0
42
1
22강 [토큰 저장] 질문
0
42
1
업캐스팅 원칙
0
56
2
음성불량
0
41
1
13강 [로그인 단일 토큰] 에서 프로젝트 실행 시 에러
0
38
1
11강 [실습] Docker로 MySQL1 분만에 실행하기
0
61
2
11강 [실습] Docker로 MySQL1 분만에 실행하기
0
51
2
6분46초
0
51
2
공략법
0
54
1
핵사고날 아키텍처 기반으로 멀티 모듈 설계 시 질문드립니다..
0
58
2
내부 객체 직접 접근에 관하여.
0
85
2
InvalidCurriculumException DIP 적용 여부 문의
0
65
2
설계 트레이드 오프 링크 접속 안됨
0
127
2
헥사고날 아키텍처와 DDD를 적용할 때, 화면에 강하게 연관된 조회 데이터를 어떻게 다루는 게 좋은지 궁금합니다.
0
175
2
Request DTO에서 Entity를 생성할 때 의존성 방향을 반대로 하면 어떨까요?
0
155
2





