[MyBatis] Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value
·
Java/스프링부트
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for {패키지.클래스.메서드.} 원인: MyBatis 기능으로 동일한 메서드에 쿼리가 중복 정의 되었다는 것해결방법mapper XML 파일과 @Mapper 애너테이션이 지정된 인터페이스를 확인해보고 동일한 패키지, 메서드를 비교해서 중복 지정하고 있는지 확인해보면 해결 가능하다.
[스프링부트] @ControllerAdvice
·
Java/스프링부트
@ControllerAdvice는 모든 컨트롤러에 대해 전역 기능을 제공하는 애너테이션입니다. @ControllerAdvice가 선언된 클래스에 @ExceptionHandler, @InitBinder, @ModelAttribute를 등록하면 예외 처리, 바인딩 등을 한 곳에서 처리할 수 있어, 코드의 중복을 줄이고 유지보수성을 높일 수 있습니다. @ControllerAdvice는 내부에 @Component가 포함되어 있어 컴포넌트 스캔 과정에서 빈으로 등록됩니다. @RestControllerAdvice는 내부에 @ResponseBody를 포함하여 @ExceptionHandler와 함께 사용될 때 예외 응답을 Json 형태로 내려준다는 특징이 있습니다.1. @ControllerAdivce 구조 및 역할역할..
N+1에서 시작된 쿼리 전략의 이해
·
Java/스프링부트
🧭 "왜 N+1이 발생하나요?"라는 질문에서 시작된 모든 것어느 날, 단순히 데이터를 조회하는 코드에서 쿼리가 너무 많이 날아가는 걸 목격했다. member.getTeam().getName() 같은 코드를 루프에서 호출했을 뿐인데, 로그에는 수십 개의 select 쿼리가 찍혔다.아… N+1 문제였다.✅ 한 번의 메인 쿼리로 데이터를 조회했지만, 연관된 데이터를 N번 추가로 조회 → 총 1 + N번의 쿼리 발생💡 여기서 첫 의문Lazy 로딩이면 필요한 시점에만 로딩되는 거 아닌가? 그런데 왜 이렇게 많은 쿼리가 발생하지?이 질문은 나를 JPA 내부의 fetch 전략, 연관관계 매핑, 그리고 성능 최적화 방법으로 이끄는 시작점이 됐다.🔍 연관관계와 Fetch 전략 이해JPA에서 연관 관계는 보통 @Ma..
스프링부트 파일 업로드 다운로드
·
Java/스프링부트
1. (전송) HTML 폼 전송 2가지 방식의 이해application/x-www-form-urlencodedmultipart/form-dataform 태그로 전송시 기본적으로 문자만 전송하는 application/x-www-form-urlencoded 로 전송POST /save HTTP/1.1Host: localhost:8080Content-Type: application/x-www-form-urlencodedusername=kim&age=20파일을 업로드 하려면 파일은 문자가 아니라 바이너리 데이터를 전송해야한다.application/x-www-form-urlencoded 은 문자를 전송하는 방식이기 때문에 파일로 전송하기 어렵다.실제로 보통 폼을 전송할 때는 달랑 파일만 전송하는 것이 아니라 문자값..