본문 바로가기

분류 전체보기

(47)
[Spring] JWT access/refresh token 인증 구현 (with redis) JWT access/refresh token 구현하기 (with redis) ⚙️ 개발 환경 aws linux2 ec2 + docker (github action 자동배포) springboot gradle java 17 redis 현재 진행하고 있는 프로젝트에서 github action + docker를 통해 cicd 구축을 해놓은 상태이기 때문에, 배포 서버에서 workflow를 수정하고 docker-compose를 통해 redis 환경을 구축하는 것까지 진행했다. 전체 코드는 여기서 확인할 수 있다. 기존에 구현했던 회원가입, 로그인 코드에 jwt access/refresh token 인증 방식을 적용했다. 📍 인증 순서 클라이언트의 로그인 요청 id/pw 검증 후 access/refresh toke..
[Spring] 배포 서버의 도커 컨테이너에 크롤링 환경 구축하기 배포 서버의 도커 컨테이너에 크롤링 환경 구축하기 ⚙️ 개발 환경 AWS Linux2 EC2 Java 17 Gradle Spring boot 크롤링 소스코드는 여기서 확인할 수 있습니다. 현재 비공개 레포로 되어있어 추후에 다른 글로 정리해서 올리도록 하겠습니다. 📍 Dockerfile : 도커 컨테이너에 크롬 브라우저 및 크롬 드라이버 설치 후 배포 FROM openjdk:17.0.1-jdk-slim RUN apt-get -y update RUN apt -y install wget RUN apt -y install unzip RUN apt -y install curl RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd..
[Spring] OSIV와 성능 최적화 OSIV와 성능 최적화 Open Session In View: 하이버네이트 Open EntityManager In View: JPA 📍 OSIV ON spring.jpa.open-in.view : true 기본값 위의 기본값을 뿌리면서, 애플리케이션 시작 시점에 warn 로그를 남김 기본적으로 jpa는 트랜잭션을 시작할 때 db 커넥션을 가져옴 (영속성 컨텍스트) > api가 유저에게 반환될 때까지 살아있음 즉, 고객의 요청에 Response가 갈 때까지 영속성 컨텍스트가 살아있기 때문에 View Template이나 API 컨트롤러에서 지연 로딩이 가능했던 것 지연 로딩은 영속성 컨텍스트가 살아있어야 가능 > 영속성 컨텍스트는 데이터베이스 커넥션을 유지해야 함 하지만 이 전략은 너무 오랜시간동안 db c..
[Spring] API 개발 정리 API 개발 고급 정리 📍 API 개발 정리 엔티티 조회 엔티티를 조회해서 그대로 반환 엔티티 조회 후 DTO로 변환 페치 조인으로 쿼리 수 최적화 컬렉션 페이징과 한계 돌파 컬렉션은 페치 조인시 페이징이 불가능 ToOne 관게는 페치 조인으로 쿼리 수 최적화 컬렉션은 페치 조인 대신 지연 로딩을 유치하고, hibernate.default_batch_fetch_size, @BatchSize로 최적화 DTO 직접 조회 JPA에서 DTO를 직접 조회 컬렉션 조회 최적화 - 일대다 관계인 컬랙션은 IN 절을 활용하여 메모리에 미리 조회해서 최적화 플랫 데이터 최적화 - JOIN 결과를 그대로 조회 후 애플리케이션에서 원하는 모양으로 직접 변환 📍 API 개발 권장 순서 엔티티 조회 방식으로 우선 접근 페치 조..
[Spring] API 개발 컬렉션 조회 최적화 API 개발 컬렉션 조회 최적화 📍 컬렉션 조회 - 엔티티를 DTO로 변환 : 기본 (V2) Entity @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name="order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") // foreign key가 무엇인지 명시 private Member member; @OneToMany(mappedBy = "order", cascade = Ca..
[Spring] 엔티티를 DTO로 변환한 API 설계 엔티티를 DTO로 변환한 API 설계 📍 엔티티를 DTO로 변환하기 - 기본 Entity @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name="order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") // foreign key가 무엇인지 명시 private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType..
[Spring] 엔티티를 노출한 API 생성하기 엔티티를 노출한 API 생성하기 📍 @JsonIgnore 사용하기 양방향 연관관계의 엔티티에서 한 쪽에는 해당 어노테이션을 붙여줘야 무한 루프를 막을 수 있음 예시를 살펴보며 이해해보면, Controller @GetMapping("/api/v1/simple-orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); return all; } Entity @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedVa..
[Spring] JPA Auditing - BaseTimeEntity JPA Auditing - BaseTimeEntity 📍 JPA Auditing 사용하기 jpa가 제공하는 audit 기능으로, 시간에 자동으로 값을 넣어줌 > 자동으로 시간을 맵핑해 데이터베이스의 테이블에 넣어줌 데이터의 생성시간, 수정시간, 혹은 생성한 사람 등을 저장해야할 때 매번 모든 엔티티에 컬럼으로 지정해서 코드를 작성하기에 번거로움 BaseTimeEntity package com.sejongmate.common.domain; import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; import lombok.Getter; impor..