본문 바로가기

Java

(189)
InteliJ test 설정 설정이 Gradle로 되어있으면 test 로딩속도가 느릴 수 있다, InteliJ IDEA로 둘 다 변경해준다
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편 - 주문조회 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 백엔드 개발자되기: 자바 편] 을 참고하였습니다.
Junit & AssertJ package com.blog; import org.junit.jupiter.api.*; public class JUnitCycleTest { @BeforeAll // 전체 테스트 시작 전 1회 실행 (static으로 선언) static void beforeAll(){ // DB 연결이나 테스트 환경 초기화할 때 사용 System.out.println("@BeforeAll"); } @BeforeEach // 테스트 케이스 시작 전마다 실행 public void beforeEach(){ // 메서드에 사용되는 객체 초기화하거나 미리 필요한 값을 넣는 경우 사용 System.out.println("@BeforeEach"); } @Test public void test1(){ System.out.println..
Thymeleaf 경로 설정하기 thymeleaf에서 static에 있는 정적 리소스를 접근하려면 이런식으로 바로 접근이 가능하다(현재 프로젝트에는 static/assets/js/js파일 구조 이다.) 하지만 templates의 도메인별 폴더를 만들어서 thymeleaf-layout-dialect를 적용했더니 경로가 안맞아서 파일이 다 깨졌다... thymeleaf 공부안하고 무작정 하니 이런 문제가 발생하는구나. thymleaf에도 jsp처럼 Context Path 사용이 가능하다. @{/} 표현식으로 상대경로 문제를 처리해줄 수 있다. See User Profile 변수 표현식도 중첩 사용가능하다. 여러개의 매개변수도 쉼표로 구분해서 사용 가능하다. @{/order/process(execId=${execId},execType='FA..