전체 글 (330) 썸네일형 리스트형 트러블슈팅 failed to lazily initialize a collection of role: personal.blog.entity.User.authorities: could not initialize proxy - no Session 오류 발생 해결하기 이번에 blog 프로젝트를 수정하면서 권한을 여러개 주기로 결정했다. 권한을 엔티티로 만들고, User와 권한을 일대다로 매핑하고 @OneToMany(mappedBy = "user") List autorities = new ArrayList(); 로 받아왔더니 spring security가 Login처리를 하는 과정에서 지연로딩 프록시 초기화가 불가능한 문제가 발생했다. 문제 해결과정 1) Hibernate.initialize(authorities)메소드를 .. blog ERD 허접한 수준의 ERD :) ... 블로그 기능추가를 위해 다시 엔티티를 모델링해보았다. Authorities를 다대다로 많이 하던데 다대다로 하기 싫어서 다대일로 풀어내려고 한다. JPA실전 2 - OSIV와 성능 Open Session In View: 하이버네이트, Open EntityManager In View: JPA (관례상 OSIV라 한다.) spring.jpa.open-in-view : true 기본값 OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트 와 데이터베이스 커넥션을 유지한다. 이를 통해 지연로딩이 가능하지만, 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다. 이것은 결국 장애로 이어진다 spring.jpa.open-in-view: false OSIV 종료 open-in-view: false 로 해야 커넥션풀이 마르지 않음. OSIV를 끄면 커넥션.. JPA 실전2 - 컬렉션 조회 최적화 권장순서 1. 엔티티 조회 방식으로 우선 접근 1. 페치조인으로 쿼리 수를 최적화 2. 컬렉션 최적화 1. 페이징 필요 hibernate.default_batch_fetch_size , @BatchSize 로 최적화 2. 페이징 필요X 페치 조인 사용 2. 엔티티 조회 방식으로 해결이 안되면 DTO 조회 방식 사용 3. DTO 조회 방식으로 해결이 안되면 NativeSQL or 스프링 JdbcTemplate 우선 엔티티 조회방식을 우선 권장함.( Batch size로 해결이 안되면 사실 캐시(Redis같은거)쓰는게 맞음.) 요즘 네트워크 성능이 좋아서 엔티티방식이나 DTO방식이나 별 차이 안남. (참고로 엔티티는 캐시에 올리면 안되고 무조건 DTO로 변환해서 DTO를 캐시해야함) 엔티티 조회방식은 JPA.. JPA 실전2편 - 주문조회 API 쿼리 방식 선택 권장 순서 1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다. 2. 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다. 3. 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다. 4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다 주문+배송정보+회원을 조회하는 API 양방향 연관관계가 걸린 곳은 꼭! 한 곳을 @JsonIgnore 처리해야한다. 안그러면 양쪽을 서로 호출하면서 무한루프발생. 엔티티를 API응답으로 노출하는것보다는 DTO로 변환해서 반환하는 것이 더 좋다. (실무에서는 List로 바로 반환하지말고 result객체로 한 번 더 감싸주자) 간단한 주문조회를 하는 컨트롤러 메서드.. JPA 실전2편 - 회원 관련 API 회원등록 API 요청 값으로 엔티티 대신에 DTO를 RequestBody에 매핑한다. @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){ Member member = new Member(); member.setName(request.getName()); Long id = memberService.join(member); return new CreateMemberResponse(id); } @Data //api용 DTO, 이렇게하면 api스펙 까지 않아도 뭐가 넘어오는지 알 수 있음.절대 엔티티로 바로 사용하지 마시오 static class.. SPRING SECURITY with JWT 토큰기반 인증이란? 토큰 기반 인증은 인증에 토큰을 사용하는 방식이다. 토큰은 클라이언트를 구분하는데 사용하는 유일한 값, 서버에서 생성해서 클라이언트에게 제공한 뒤, 클라이언트는 서버에 요청할 때마다 요청 내용과 토큰을 전송한다. 서버는 토큰으로 유효한 사용자인지 검증한다. JWT는 토큰 기반인증에서 주로 사용하는 토큰 중 하나이다. 헤더,내용,서명 구조로 이루어져있다. 리프레시 토큰은 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급하는 용도로 사용한다. Security Context는 인증 객체가 저장되는 보관소로, 인증 정보가 필요할 때 언제든지 인증 객체를 꺼내어 사용하도록 제공되는 클래스이다. 이것을 저장하는 객체가 Security Context Holder이다. jwt라이브러리 중 가장.. Thymeleaf 기본 타임리프 익히기 취미 (대표 취미) 글 보기 표현식 설명 ${...} 변수의 값 #{...} 속성 파일 값 @{...} url 표현식 *{...} th:object에서 선택한 객체에 접근 문법 설명 th:text 텍스트 표현 th:each 컬렉션 반복할 때 사용 th:if 조건이 true인 경우 표시 th:unless 조건이 false인 경우 표시 th:href 이동 경로 th:with 변수값으로 지정 th:object 선택한 객체로 지정 날짜형식을 포매팅하는 함수 (LocalDateTime -> yyyy-MM-dd HH:mm) 본 포스팅은[스프링부트 3 백엔드 개발자되기: 자바 편] 을 참고하였습니다. 이전 1 ··· 8 9 10 11 12 13 14 ··· 42 다음