개발.log/framework 6

[SpringBoot] 관습적인 추상화 Service, ServiceImpl 구조를 사용해야 할까?

Service interface와 ServiceImpl class 구조를 사용하는 이유? 대부분의 프로젝트는 Service를 만들 때 MemberService와 같이 서비스를 인터페이스로 설계하고, MemberServiceImpl 라는 구현체인 클래스를 생성해서 사용하는 방식으로 설계됩니다. 그동안 프로젝트를 하며 이유도 모른체 그냥 구조가 그런가 보다 하면서 계속 만들어서 사용하다가 이번에 그 이유에 대해 알고 싶어서 잘 정리된 몇몇 분들의 자료를 참고하여 정리하게 되었습니다. 내용 중 잘못된 부분은 댓글을 통해 말씀해주시면 찾아보고 수정하며 공부하겠습니다. 이론상으로 위와 같은 Service, ServiceImpl 패턴으로 설계를 해야하는 이유는 인터페이스와 구현체를 분리함으로써 구현체를 독립적으로 ..

[SpringBoot] @RequestParam과 @PathVariable 차이

온보딩 과제를 수행하다보면서 느낀점은 아주 기본적인 것에서 실수하는 일이 생각보다 많다는 것이다. 다시금 CS 공부의 소중함을 깨닫고.. 오류해결 과정을 포스팅한다. Resolved org.springframework.web.bind.MissingServletRequestParamterException 서버를 실행하고 API를 실행하니 바로 오류가 발생했다. 그 이유는.. PUT으로 mapping한다고 적어놓고, @RequestParam을 당당하게 적은 탓이다^^...@PutMapping은 @PathVariable로 리소스 id를 받아야한다. controller에서 parameter를 받는 방법에는 여러가지가 있다. 그 중 가장 많이 사용하는 두 가지를 혼돈할 줄은 몰랐는데... 다시는 이런실수 하지않기..

[Lombok]@ToString 부모의 toString() 함께 출력하기

자바 쫌 써봤으면 extends 상속은 당연히 했겠지? 평소와 다름없이.. extend로 DTO를 공장처럼 찍어낼 때, 갑자기 이상한 현상이 나왔다. Super() 키워드로 분명, 부모클래스를 초기화했는데 자식클래스에서 logging을 해보니까 부모가 없는것..!? 근데 또 디버깅모드로 직접 객체 안을 살펴보면 잘 들어가있다..? 대환장 - 이때 사용하면 되는 태그가 바로 @ToString(callSuper = true) callSuper()의 default가 false이니 @ToString(callSuper = true)로 설정해 줍니다. false일 경우 부모의 toString을 출력해주지 않겠다는 설정이기 때문에 꼭 True로 바꿔줘야 한다. @Data @EqualsAndHashCode(callSu..

[SpringBoot]Multiple @RequestBody values in one controller method/@RequestBody 여러 개 사용/HttpMessageNotReadableException 해결

무지성으로 개발하다 보니,, 점점 기본적인 CS 지식들을 잊어버리는 기분이 들었다. 당연하게 @RequestBody를 쓰던 중 추가되는 요건으로 점점 DTO는 늘어나고,, @RequestBody를 추가하는 일이 생겼다. 문법적 오류는 없었기 때문에 별다른 이슈가 없었고 API를 실행하니 터졌다ㅋㅋㅋㅋ org.springframework.http.converter.HttpMessageNotReadableExcept ion: Required request body is missing 한마디로.. RequestBody를 JSON형식으로 파싱하여 인식하지 못했다는 것이다. 생전 처음 보는 이슈에 이게 뭐지.. 싶었지만 자세히 보니 @RequestBody가 두 개 선언되어 있는 나의 controller를 마주했다..

[Mybatis][iBatis] org.apache.ibatis.binding.BindingException 에러해결 - 다중 매개변수 객체(DTO, String)넘기기

org.mybatis.spring.MyBatisSystemException : nested exception is ... 개발하면서 분명 mybatis parameter Binding 오류가 난 적이 없었는데;;; 오랜만에 구글링하여 공백이 있는지.. 마감태그는 잘 닫혀있는지,, 일반적으로 확인할 부분들을 한참 확인하고 나서도 해결되지 않았다... 그러다가 아래 사실을 간과했다는 것을 깨닫고, 겸허한 마음으로 다시 배우고자 한다. MyBatis와 iBatis는 두 가지 다른 버전의 라이브러리이며, 각각의 라이브러리 버전에 따라 동작 방식이 조금 다를 수 있습니다. 또한 데이터 바인딩에 대한 규칙 및 기본 설정도 이 두 라이브러리 간에 다를 수 있다. 아래 3.0.0 기준에서는 별도의 어노테이션을 설정하지..

[Mybatis] XML태그 <choose>, <when>, <otherwise>로 동적쿼리 Dynamic SQL 구현하기

자바 인터페이스 Mapper를 통해 쿼리를 구현할 때, 파라미터를 그대로 바인딩해서 사용해야 더 효율적인 쿼리를 구현할 수 있다. 왜냐면... 수정할 때 하나 바꾸면 다 바뀌는 게 좋잖아요? 개발자는... 같은 코드를 반복하지 않지 :) 구조 및 사용법 쿼리1 쿼리2 쿼리3 쿼리4 쿼리5 태그는 태그와 함께 사용되며, 조건을 여러 번 작성할 수 있다. 실행 시 태그의 조건식을 순서대로 확인하며 쿼리문을 실행하게 된다. 만약 태그의 조건 식중 true 반환한 것이 없다면 태그 내에 작성된 쿼리문이 실행된다. 태그는 생략 가능하다. 적용 예제 XML AND TISTORY_CODE = '*' AND TISTORY_CODE = '1' AND TISTORY_CODE = '0' ORDER BY BASE_YMD My..