안녕하세요~ 이번에 API 연동 서비스를 새로 구축하면서 들었던 의문점, 고민들에 대해서 질문드리고자 합니다.
질문 전 상황 설명을 좀 하자면...
기존 api 서비스는 original asp로 구축되어 있었고 얼마전 spring boot로 모바일 backend 서버로 구축한게 있구요.. 이 spring boot 서비스에다가 restful api 서비스를 구축하 있습니다..
1. 공통적으로 실행하는 데이터 유효성 검사등에 validator 을 이용하는게 좋을지
: 이름부터가 딱 유효성 검사기이다 보니 활용해볼까 하는데요. 실무에서 vaildator 많이 쓰나요? 사용상의 유의할 점이라던지 활용방법에 대해서 알려주시면 감사하겠습니다~
2. token(api-key) 및 허용된 IP 등 인증 처리 문제
: jwt 방식은 아니고 api-key를 그냥 db에 관리하고 있는데 어떤 방법으로 인증 처리하는게 좋을까요?
- spring security 에서 custom authentication 사용해서 인증처리
- filter를 생성하여 인증로직 구현
- validator 활용하여 인증로직 구현 (validator에 header값 매핑가능한가요?)
- oauth 연동
- 기타 더 좋은방법
3. Exception 처리에 대해
: custom exception 만들어서 @controllerAdvice 로 커스트마이징한 exception handler에서 response text 관리하려고 하는데 실무에서 이렇게 많이 쓰나요? : filter 처리시 new exception 발생시키면 @controllerAdvice 로 커스트마이징한 exception handler는 사용할 수 없던데 혹시 필터에서는 Exception 관리를 어떻게 하시는지도 궁금하네요..
4. Parameter, RequestBody, Header 값 매핑 처리에 대해
: api로 받는 데이터와 기존 데이터간의 키값이 상이한 경우 어떤식으로 매핑처리 해야하는지 감이 안잡히네요.. 일단 controller마다 vo 만들어서 자동으로 매핑 받을건데 생성자에 기존 키값들과 매핑시키는 로직을 만들어야 하나 고민중입니다.. 어떻게 관리하는게 좋을까요?
: 그리고 @PathVariable, @RequestHeader, @RequestBody 등 모든 값들을 한번에 binding하는 방법은 없을까요?
5. package 관리에 대해
: 기본적으로 controller, domain, mapper, service 등으로 구분되어 있는데요.. 기능과 사용처가 많아지니까 관리하기가 애매하네요.. 어떻게 기준 정의해서 사용하고 계시는지 말씀해주실분 계실까요?ㅎㅎ
4년전 자바 교육 받은 이후 처음으로 구축해보는거라 완전 기초밖에 모르겠네요ㅋ 그나마 작년에 했던 spring core 스터디가 좀 도움이 됬네요 ㅋㅋ 실무에서 주로 쓰는 기술들 공유 좀 부탁드립니다~~
4개의 의견 from SLiPP
질문이 조금 광범위해서 댓글이 없을까요 저는 경험많으신 분들의 댓글을 기대했지만 댓글이 없으니 제가 생각하는 것과 경험한 것을 조금 적어보자면..
1) 데이터 유효성 검사는 @Valid 와 BindingReulst 의 조합으로 많이 처리했습니다.
2) 샘플코드 돌려서 이런 비슷한 요구사항이 오면 대응하려고 준비해둔 것이 있긴한데 이수홍님의 스프링부트 JWT 처리하는 것까지는 어느정도 따라해봤습니다. 저라면 Oauth 연동
3) 필터에서 예외를 발생시킨 적이 없어서 모르겠네요 ㅠ @ControllerAdivce 에서 주로 처리했습니다.
4) 조금 디테일한(어떤 변수가 어떤 VO 안에 들어간다는?) .. 요구사항 정보가 있었으면 좋겠습니다. 아직 잘 모르겠습니다.ㅠ
5) 방법이 여러개 있겠지만.. 제 개인프로젝트에 한한 경험으로..예전엔 controller, domain 따로 패키지를 만들고 그 안에 하나씩 패키지를 만들어서 처리했는데..지금은 주제별로 패키지를 만들고 그 안에 controller, domain 등등의 패키지를 집어 넣게 되었습니다. 개인프로젝트간에 복붙해서 바로 쓸 수 있게 하려는 생각입니다.
나도 실무에서 restful api 서버를 구축한 경험이 없기 때문에 제대로 된 답변이 될 수 있을지 모르겠다. 상당부분 @아라한사 답변과 비슷하다.
1) validator 많이 사용할 듯하다. 그렇지 않으면 유효성 검사 관련 코드가 너무 지저분한지라.
2) spring security 사용하고 oauth 기반으로 구현하는 것이 나름 안정적일 듯하다. 뭐 자체적으로 인증 token 관리가 잘 되고 있다면 그 또한 좋은 선택이지만 생각보다 쉽지 않을 듯하다.
3) @ControllerAdvice는 자주 사용. 만약 필터에서 예외를 발생시켜야 한다면 에러 상황에 맞춰 HttpServletResponse로 status code를 반환하면 되지 않을까?
4) 이건 상황에 따라 다를 듯하다. 만약 도메인 모델과 다른 점이 많다면 별도의 DTO를 만들어 처리하는 것이 좋겠고, 그렇지 않은 경우는 도메인 모델을 재사용하는 방식이 좋을 듯하다. 정확한 질문의 의도를 100% 이해하지 못했다. @PathVariable, @RequestHeader, @RequestBody를 모두 처리하는 방법은 모르겠다.
5) 패키지 구조는 어떻게 가져가는 것이 좋을까? 글 한번 보면 좋겠다. 패키지 구조 또한 지속적인 리팩토링이 중요한 영역이다. 어차피 소스 코드가 많아지면 복잡해질 수 밖에 없고, 일정 수준이 넘어가면 프로젝트를 분리해서 관리하는 것이 좋은 선택이 되는 순간이 올거다.
1) 써본적 있습니다. 올 상반기까지는 SI 프로젝트만 돌아다닌지라 다들 안쓰는 분위기긴 했는데.. 올 상반기 설겆이 들어간 프로젝트에서 유효성 검사가 너무 부실해서 도입해 사용헀습니다.
2) 아직 처리해본적은 없고 향후 예상되는 이슈인지라 미리 사전조사만 해둔 상태인데, 특별한 문제가 없다면 Oauth 2.0을 쓸 계획입니다.
3) 박재성 교수님 답변과 동일합니다. 뭔가 갑자기 가물가물한데.. ExceptionHandler에서 return type을 ResponseEntity로 처리했을겁니다.(JSON으로 리턴해야 하는 상황이었던 걸로....)
4) 매핑 처리는 상황에 따라 다를것 같습니다. 코드성이면 애초에 Enum으로 잡는선에서 끝났을거 같긴 한데.. 질문하신 내용이 그 케이스는 아닌것 같구요..사실 저도 질문이 잘 감이 안옵니다..; (애초에 UI쪽에 서버쪽에 맞게 Unformat 해서 넘겨달라고 요청할것 같긴 한데..물론 보통 UI도 제가 하니까 할수 있는 소리지만요..)
5) 저는 박재성 교수님 아티클중 2안이네요. 가독성 문제도 있었고 향후 퍼포먼스상 프로젝트 분할 관리하는 이슈도 있었고 해서 추려낼 생각을 하다 보니..
4-2번은 잘 모르겠습니다(죄송) 제가 훌륭한 개발자가 아니다 보니 그냥 이런 사람도 있다더라 정도만.. :)
2), 3) httpServletResponse.getWriter().write(com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(Object)) 사용해서 responseEntity를 json string으로 출력해주려 했었는데 그냥 interceptor에서 처리하는게 나을듯 합니다. @ControllerAdvice로 일관성있는 예외처리가 되고 컴포넌트들의 DI 가 가능하고.... 필터보다 훨씬 나은듯하더군요..ㅎㅎ
4) api - requestBody 변수간 매핑 처리에 대해 막연한 구상하고 있던 내용에 대해 방법을 제시한 글을 찾았습니다!
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.