작성
·
1.5K
답변 1
10
안녕하세요. 늦었지만 개인적인 의견 남기고 갑니다. 우선 답변 달기 전에 컨벤션은 어디에서나 항상 적용되는 규칙이 아니라는 점. 미리 밑밥을 깔아두겠습니다. 제가 이해하고 생각하는 각각의 동사에는 아래와 같은 특징이 있었습니다.
verify
"어떤 절차를 제대로 수행했는지" 물어보는 동사라고 생각합니다. 여기서 말하는 절차는 질문자님이 정리해주신 것처럼 과정
이라고 보는 게 좋겠네요. 그리고 그 과정은 코드 레벨에서의, 어떤 알고리즘이나 메서드를 의미합니다. 그래서 과정이라고 표현하는 질문자님의 설명이 딱 좋은 설명인 것 같습니다. 예를 들면 Mockito의 assert 함수 중에는 verify라는 메서드가 있습니다. "어떤 메서드가 실행되었는지, 확인할 때 사용하는 메서드인데요. 지정한 메서드가 호출되지 않았다면 assert에 실패합니다. 그래서 interaction test에 자주 사용되는 assert 문이고요. 아래와 같이 사용합니다.
verify(myObject).doSomething() // myObject.doSomething()이 한 번이라도 실행되었는 지를 검증한다.
validate
개인적으로는 "사용자 입력이 제대로 되었는지"를 판단하는 경우라고 생각합니다.
ex.1 프론트엔드에서는 사용자 입력 form에 값이 제대로 들어갔는지, format은 지켰는지 등을 확인하는 과정을 보고 form validation
이라고 부릅니다.
ex.2 백엔드 입장에서는 API를 호출하는 호출자가 사용자입니다. 그래서 호출자의 request body가 포맷에 맞춰 값이 제대로 들어갔는지 확인하기 위해 spring-boot-starter-validation
이라는 라이브러리를 사용합니다. (@Valid, @Vlidated 어노테이션을 사용해보신 적 있으실 겁니다.)
참조: https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation
참조: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation
@Validated
@RestController
@RequiredArgsConstructor
public class MyController { ... }
아마 최종 결과라고 표현해주시는 것도 이런 의미에서 말씀해주신 것 같은 데, 맞으시겠지요??
is
엄밀히 말하면 is는 'boolean 상태를 반환하는 getter
' 그 이상, 그 이하의 의미도 아니라고 봅니다. 종종 누군가 만들어둔 검증 로직을 보면 if (isError()) throw new RuntimeException();
같은 분기문을 보실 수 있습니다. 그래서 is 자체가 '뭔가 검증과 관련된 추가적인 의미를 갖는 건가?'라는 생각이 들기도 하죠. 그런데 곰곰히 생각해보면 사실 예시라고 들어드린 코드에서도, isError()
는 getter 이상의 의미가 아닙니다. 그래서 저는 "is 는 getter다."라고 생각합니다. 참고로 더 나아가 is를 접두어로 사용하는 메서드라면 상태를 반환하는 것 이상의 로직이 들어가선안된다고 '저는' 생각합니다.
ex. jackson 에서는 is 로 시작하는 메서드가 있다면, 이를 boolean 상태를 들고 있는 것으로 간주하고 json으로 serialize하려 할 때 property 값중 하나 인 것으로 serialize 합니다.
check
이 동사에 대해서가 가장 의견이 분분할 것 같습니다. 개인적으로 check는 어떤 상태가제대로 되어있는지, 아닌지를 판단하는 것보다 상태를 '확인'만 하는 것이라고 봅니다. 예를 들어 보통 verify나 validate은 '상태가 잘못되어있다면 에러를 던진다.'라는 의미가 일부 내포되어 있습니다. 반면 check는 값의 옳고 그름과는 상관없이, 곧이 곧대로 반환하는 경우입니다. 상태가 의도한 것과 다르더라도 에러를 던지지는 않는거죠.
ex) Java IntelliJ 의 유명한 스타일 검사 도구인 checkstyle은 정적 분석을 통해 코드의 컨벤션이 잘못된 부분을 찾아주지만, 실제로 고쳐주지는 동작까지는 하지 않습니다.
참조: https://checkstyle.sourceforge.io/
물론 이런 컨벤션은 따라도 그만, 안따라도 그만입니다. 그리고 관련해서 예외 사례들도 너무나 많고요. 그래서 크게 중요하지 않은 내용이라 판단되서 강의에서 뺀 것이기도 하고요. 하지만 한 번쯤은 생각해볼 법한 주제라고 생각합니다. 그런 의미에서 질문자분께서 이러한 내용에 대해서 한 번이라도 더 고민하시고, 정리까지 하셔서 이렇게 글 남겨주시는 모습을 보니 강의를 찍기를 참 잘했다라는 생각이 드네요.
이미 알고 계실 수도 있겠지만 갑자기 강의에 담고 싶었던 내용인데, 분량상의 문제로 빠진 내용도 생각이 나서 첨언 해봅니다. 위에 제가 상태
라는 용어를 좀 사용했었습니다. 여기에 덧붙여서 설명해 드리고 싶은데요.
"getter는 어떤 객체의 상태를 반환하는 메서드다."
종종 이런 설명을 읽다보면 그런 생각이 듭니다. 이게 실제로 개발을 하다보면 멤버 변수랑 크게 다를 게 없어 보이는 개념인데, 명확하게 멤버 변수라는 용어를 사용하지 않고, 왜 굳이 상태
라는 용어를 사용하는 걸까요? 여기서 말하는 상태
란 무엇일까요?
예를들어 아래 코드를 보겠습니다.
class Account {
private int mileage;
private boolean admin;
}
Account 라는 클래스는 mileage, admin 이라는 멤버 변수를 갖고 있습니다. 그럼 Account의 getter는 getMileage()
, isAdmin()
만 만들어질 수 있을까요? 아닙니다. 도메인이 어떠냐에 따라 다르지만, 아래와 같은 getter들도 만들어질 수 있을 겁니다.
class Account {
private int mileage;
private boolean admin;
public int getMileage() { return mileage; }
public boolean isAdmin() { return admin; }
public boolean isMember() { return !admin; }
public String getLevel() {
if (mileage > 1_000_000) return "VIP";
else if (mileage > 500_000) return "A";
else if (mileage > 100_000) return "B";
else return "C";
}
}
그래서 상태는 멤버 변수보다는 약간은 더 포괄적인 개념이고, 변수에 대응되는 개념이라기보다는 변수에 들어가 있는 값이며, 값에 따른 현재의 모습인 겁니다. 멤버 변수랑은 묘하게 다른 개념이면서 좀 더 포괄적인 단어이기 때문에, 보통 설명하는데 있어서 멤버 변수라는 단어보다 상태
라는 단어를 많이 쓰게 되는 것 같습니다. (그런데 보통은 상태에 대응하는 멤버 변수를 일일이 만드는 경우가 많으니 거의 1:1 대응되는 개념이긴 합니다.)
약간 듣고나면, 오히려 헷갈리기만하고 현업에서도 유의미하게 분리되서 사용되는 개념은 아니라서, 강의에서는 뺏는 데, 사족으로나마 달아봅니다.