작성
·
169
·
수정됨
1
안녕하세요, 토비님.
메서드 파라미터가 많아질 경우 record 타입의 parameter object를 사용하여 가독성을 높일 수 있는 방법을 소개해주셨는데요,
이 방법으로도 parameter object 인스턴스 생성 시 argument를 잘못 전달한다거나 등의 휴먼 에러는 여전히 발생 가능하지 않나 생각이 듭니다.
java record도 kotlin의 named parameter와 같은 기능을 제공하면 좋겠지만 검색해봤을땐 아직 제공하지 않는 것 같더라구요.
이처럼 argument 전달 버그는 예방할 방법이 없을까요? 혹은 강의 뒷부분에서 이러한 점을 개선해주실까요?
record에 builder를 사용해야 하나 생각이 들긴 하는데, 괜찮은 방법인지는 물음표네요.
답변 3
3
안녕하세요.
네. 말씀하신대로 record도 생성자 호출로 값을 넣는 거라서 같은 타입이 연속으로 나오면 실수할 가능성이 있습니다. 저도 코틀린으로 개발할 때 named parameter를 사용하는 게 무척 편했는데요. 자바에서는 Builder를 사용하기엔 필수 값을 모두 받지 못할 수도 있어서 기피하게 됩니다. 어떨 땐 차라리 setter로 넣는게 코드에서 혼란이 없지 않나 싶기도 하고요. 이건 참 풀리지 않는 문제입니다.
그래도 도메인 계층으로 넘길 때는 record를 사용하고, 이 record를 컨트롤러에서 API로부터 전달되는 값을 받을 파라미터로도 사용하면, 이때는 API로 전달되는 값을 이름으로 매핑해서 받을 수 있으니 조금 더 안전하지 않을까 싶습니다. 어쨌든 주의해야 할 곳이 줄어드는 것만으로도 도움이 될 것 같고요.
사실 named parameter나 setter를 쓰더라도 실수하기도 합니다. 비슷한 이름의 프로퍼티가 있는 경우나, 정말 순간 헷갈려서 다른 값을 넣기도 하죠. 이런 코딩 실수를 최대한 막아줄 방법을 계속 궁리를 해봐야겠습니다.
0
동일 타입이 근접해서 나열된 파라미터 리스트에서 실수를 피하는 가장 쉬운 방법은 말씀하신대로 타입을 다르게 만들면 됩니다. 그러면 순서가 꼬여도 바로 컴파일러에서 체크가 되죠. 대부분 원시타입을 VO로 만드는 방법이겠죠.
하지만 이게 개발자가 변경할 때 실수를 줄여주는 것 그 이상의 가치를 주는 것이 아니라면 오버가 맞습니다. 자바의 Record이나 롬복의 @Value 덕분에 만들기는 쉬워졌지만, 단순 입출력과 저장조회에서만 쓸게 아니라면 로직을 적용하는 코드에서 코드가 복잡해 집니다.
저는 실무에선 코틀린을 주로 쓰는데, 거기서는 named parameter를 최대한 활용해서 사람의 실수를 막습니다. 그 경우 호출 인자를 나열하는 순서도 중요하지 않아서 편리합니다. 하지만 자바는 필수 값을 지정할 수 없는 @Builder를 제외하면 불가능하고, 빌더는 호출코드가 깔끔하지가 않습니다.
그래서 같은 목적이라면 같이 다니는 파라미터 오브젝트를 사용합니다. 그런데 이것도 복잡해질 수 있겠죠. Part 2에서는 그부분도 다룰 생각입니다.
어쩌면 영원한 고민이겠네요. 특히 비슷한 타입의 순서를 잘못 바꿨다가, 실무에서 논리적인 버그로 아주 애를 먹어봤던 경험이 있다면 (저처럼) 더욱 그렇죠.
더 좋은 접근방법이 있을까 계속 생각해보겠습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 대흉근님께서 주신 질문에 대해 답변 드립니다.
자바의 record
는 가독성을 높이고 코드의 간결함을 위해 도입된 기능으로, 파라미터가 많을 때 종종 사용됩니다. 그러나 말씀하신 것처럼 여전히 인스턴스 생성 시 인자의 순서를 잘못 지정하는 등의 휴먼 에러가 발생할 수 있는 가능성이 있습니다.
자바에서는 아직 Kotlin의 named parameter와 같은 직접적인 기능은 제공하지 않습니다. 하지만 몇 가지 해결책을 고려해 볼 수 있습니다:
Builder 패턴 활용: 말씀하신 대로, Builder 패턴을 사용하여 인스턴스를 생성하는 방법을 고려해 볼 수 있습니다. Builder를 사용하면 인자 순서에 민감하지 않게 되어 비교적 안정성이 높아집니다. 이는 특히 많은 매개변수를 가진 객체 초기화에 유용하게 사용됩니다.
@NonNull과 같은 애노테이션 활용: Lombok 등의 툴을 활용하여 각 필드에 @NonNull 애노테이션을 적용하면, 필수적인 필드가 누락될 경우 컴파일 시점에서 체크하여 오류를 방지할 수 있습니다.
IDE의 자동 완성 기능 활용: Intellij IDEA와 같은 많은 IDE에서 제공하는 리팩토링 및 자동 완성 기능을 사용하여 실수를 최소화할 수 있습니다.
관련된 주제로는 어떻게 메소드 인자의 가독성을 높일 수 있을까?라는 질문이 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
무의식적으로 setter를 피하고 있었는지 생각 못해봤네요 ㅎㅎ;
답변 감사드립니다!