스프링

    JPA DTO 직접조회 방식

    DTO 조회 방식은 엔티티가 아니기 때문에 지연로딩이나 페치 조인을 사용할 수 없다. DTO 조회 방식은 단순히 DB에서 데이터를 가져와서 DTO의 필드에 값을 채워주는 방식이다. 이때, 엔티티에는 값을 따로 할당하지 않기에 영속성 컨텍스트에도 DB에서 조회한 데이터가 들어가지 않는다. 엔티티 조회: 페치조인을 하지 않고 일반 조인을 하면 프록시 객체가 엔티티에 들어오는데 이를 실 객체로 만들기 위한 객체 탐색시 추가 쿼리가 나갈 수 있다. DTO 조회: DTO의 생성자의 인자 값만 받기에 프록시 객체 탐색 자체를 하지 않는다. 애초에 엔티티를 조회하지 않기 때문이다. 그럼 DTO로 바로 조회하는 방법이 훨씬 좋은 것 아닌가? 아니다. 엔티티를 조회하면 fetch join을 사용할 수 있기 때문에 컬렉션..

    Subquery returns more than 1 row

    오류 메세지 서브쿼리의 결과가 2행이상일때 발생하는 에러이다. 기존 코드 List boards = queryFactory .select(board).distinct() .from(board) .join(board.home, home).fetchJoin() .join(home.homeImages).fetchJoin() .where(board.id.eq( select(heart.boardId) .from(heart) .where(heart.userId.eq(userId)) )).fetch(); where절에서 eq()로 비교를 하는데 eq는 '=' 비교이므로 서브쿼리의 결과가 1개만 반환될 경우 사용가능하기에 2개이상이 반환되면 위와 같은 오류 메세지가 발생한다. 해결 List boards = queryFa..

    @OneToOne 양방향 LazyLoading 실패

    https://velog.io/@moonyoung/JPA-OneToOne-%EC%96%91%EB%B0%A9%ED%96%A5-%EB%A7%A4%ED%95%91%EA%B3%BC-LazyLoading [JPA] OneToOne 양방향 매핑과 LazyLoading OneToOne 양방향 매핑 시 주인이 아닌 쪽에서는 Lazy Loading 할 수 없다. velog.io https://giron.tistory.com/47 [JPA] 양방향 매핑 OneToOne Lazy 이슈 OneToOne에서 새로운 이슈를 맞이했다... 쿼리가 두번 나가는 즉, eager로 로딩이 된다. 바로 OneToOne으로 Lazy 로딩을 사용하려면 따로 설정을 해야한다. 또한 OneToOne관계는 fk를 어디에 두느냐에 따라 giron...

    EntityNotFoundException: Unable to find com.aloharoombackend.model.HomeImage with id 1

    https://bkjeon1614.tistory.com/35 javax.persistence.EntityNotFoundException: Unable to find ... with id 0 에러 데이터를 저장할 때 @OneToOne, @OneToMany.. 등의 annotation이 선언되어 있을 경우에는 매핑된 id값이 0이거나 매핑되어있는 id의 자식객체가 없을 때 오류가 발생하는 경우가 있다. 이 경우 매핑되는 애 bkjeon1614.tistory.com https://sbe03005dev.tistory.com/entry/JPA-orphanRemoval [JPA] orphanRemoval 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제해주는 기능이다. @Entity public clas..

    Spring Boot 파일 업로드 용량 제한 설정

    에러 메세지 스프링을 통해 파일 업로드를 구현하던중 위와 같은 오류메세지가 발생했다. "The field imgFile exceeds its maximum permitted size of 1048576 bytes." 업로드 할 수 있는 파일의 최대 용량를 초과하여서 발생한 오류였다. 이 때, 1048576 bytes는 약 1MB로 용량 설정을 하지 않았을 때의 디폴트 값이다. 해결 해결 방법은 spring boot의 파일 용량 설정값을 변경하면 된다. application.yml spring: servlet: #파일 용량 설정 multipart: max-file-size: 10MB max-request-size: 10MB

    스프링 부트 - 오류 페이지

    스프링 부트는 오류 페이지는 기본으로 제공한다. ErrorPage 를 자동으로 등록한다. 이때 /error 라는 경로로 기본 오류 페이지를 설정한다. new ErrorPage("/error") , 상태코드와 예외를 설정하지 않으면 기본 오류 페이지가 보여진다. 서블릿 밖으로 예외가 발생하거나, response.sendError(...) 가 호출되면 모든 오류는 /error 를 호출하게 된다. BasicErrorController 라는 스프링 컨트롤러를 자동으로 등록한다. ErrorPage 에서 등록한 /error 를 매핑해서 처리하는 컨트롤러다. 오류가 발생했을 때 오류 페이지로 /error 를 기본 요청한다. 스프링 부트가 자동 등록한 BasicErrorController 는 이 경로를 기본으로 받는다..

    [스프링 MVC 2편] 로그인 처리2 - 필터, 인터셉터

    공통 관심 사항 요구사항을 보면 로그인 한 사용자만 상품 관리 페이지에 들어갈 수 있어야 한다. 앞에서 로그인을 하지 않은 사용자에게는 상품 관리 버튼이 보이지 않기 때문에 문제가 없어 보인다. 그런데 문제는 로그인 하지 않은 사용자도 다음과 같은 http://localhost:8080/items 를 직접 호출하면 상품 관리 화면에 들어갈 수 있다는 점이다. 이렇게 애플리케이션 여러 로직에서 공통으로 관심이 있는 있는 것을 공통 관심사(cross-cutting concern)라고 한다. 여기서는 등록, 수정, 삭제, 조회 등등 여러 로직에서 공통으로 인증에 대해서 관심을 가지고 있다. 이러한 공통 관심사는 스프링의 AOP로도 해결할 수 있지만, 웹과 관련된 공통 관심사는 지금부터 설명할 서블릿 필터 또는..

    [스프링 MVC 2편] 로그인 처리1 - 쿠키, 세션 (2)

    로그인 처리하기 - 서블릿 HTTP 세션 1 HttpSession 소개 서블릿을 통해 HttpSession을 생성하면 다음과 같은 쿠키를 생성한다. 쿠키 이름이 JSESSIONID이고, 값은 추정 불가능한 랜덤 값이다. Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05 HttpSession 사용 SessionConst public class SessionConst { public static final String LOGIN_MEMBER = "loginMember"; } HttpSession에 데이터를 보관하고 조회할 때, 같은 이름이 중복되어 사용되므로, 상수를 하나 정의했다. LoginController - loginV3() @PostMapping("/log..