[JPA] JPA의 entity 상태와 영속성 컨텍스트의 기능들
·
Spring
엔티티 매니저와 엔티티 매니저 팩토리JPA에서는 2가지 객체를 제공한다.엔티티 매니저와 엔티티 매니저 팩토리이다.엔티티 매니저는 스레드 당 하나씩 가지는 객체로, 스프링에서 사용한다고 가정했을 때 하나의 요청에 대해서 하나의 엔티티 매니저를 가진다고 생각하면 편하다.따라서, 이 엔티티 매니저는 동시성 처리가 되어있지 않기 때문에 절대로 스레드간에 공유해서 사용해서는 안된다.또한, 앞에서 설명할 영속성 컨텍스트의 기능들은 하나의 스레드 내에서 처리되는 작업들임을 명심하자!엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저를 뽑아내는 팩토리 공장이다.따라서, 모든 스레드들이 같은 팩토리를 사용하고 이 팩토리에서 만들어진 엔티티 매니저를 각자 사용하게 된다. @PersistenceContext pri..
[ Spring Boot ] CommandLineRunner와 ApplicationRunner
·
Spring
CommandLineRunnerSpring Boot의 초기 설정 과정의 마지막에 실행되는 메서드를 정의한 인터페이스Runner 인터페이스를 상속한 인터페이스아래의 메서드를 정의하고 있다.void run(String... args) throws Exception;ApplicationRunner마찬가지로 Spring Boot의 초기 설정 과정의 마지막에 실행되는 메서드를 정의한 인터페이스Runner 인터페이스를 상속한 인터페이스아래의 메서드를 정의하고 있다.void run(ApplicationArguments args) throws Exception;차이점둘의 차이점은 메서드 시그니처에서 매개변수 타입이 다른 것 밖에는 없다.ApplicationArguments는 argument를 조회하는 편의 메서드들을 ..
[Spring WebSocket] Spring WebSocket에서 STOMP를 사용해보자~~
·
Spring
개요클릭 미! 프로젝트를 진행하면서 웹 소켓을 통한 양방향 통신이 필요했고 이를 사용하기 위해 학습했다!본론해당 포스트에서는 스프링에서 WebSocket, STOMP(Stream Text Oriented Messaging Protocol)의 사용 방법을 기재한다.build.gradleimplementation 'org.springframework.boot:spring-boot-starter-web'implementation 'org.springframework.boot:spring-boot-starter-websocket'Spring Web과 WebSocket을 추가해준다!먼저 나는 웹 소켓에 STOMP를 사용하여 규격이 있는 메시지를 송수신하도록 했다.WebSocket웹 소켓 등록은 다음과 같이 해준다..
[Spring Boot] 등록 요청의 중복 방지하기, 멱등성 보장
·
Spring
개요프로젝트를 진행하던 중 게시글의 요청이 연속으로 두 번 오면 게시글이 2개 작성되서 이전에 만들어둔 로직과 충돌하는 일이 발생했다.기존의 로직은 현재 진행중인 게시글이 있다면 더이상 게시글이 작성되지 않도록 했지만 연속으로 들어오는 요청을 방지할 방안이 없었다.즉, 2개의 요청이 들어왔을 때, 진행중인 게시글의 존재 여부를 체크를 2개의 요청이 모두 넘어가면 2개의 게시글 모두 작성된다는 문제가 발생한다.문제의 코드@Override public WantedResponseDTO createWanted(WantedDTO wantedDTO, MultipartFile mainImage, MultipartFile signature) throws IOException { UserEntity u..
[Spring Boot] 스프링 동시성 제어하기 (Java Synchronized keyword)
·
Spring
개요프로젝트를 진행하던 도중 실수로 유저가 동시에 버튼을 두 번 연속으로 누를 경우에 회원가입이 두번 발생하는 현상이 있다는 것을 알게되었다.이런 문제를 해결하는 방법을 찾아보던 중 동시성 제어를 해서 두 개의 스레드가 동시에 임계 구역으로 진행하지 못하도록 세마포 역할을 하는 무언가가 있어야한다는 것을 알게되었고 해당 내용을 테스트 해보았습니다.자바의 동시성 제어여러 스레드가 하나의 자원을 공유해서 레이스 컨디션이 발생하는 것을 방지해야 합니다. 자바에서는 synchronized 키워드를 통해서 메서드에 대한 동시성을 제어할 수 있었습니다.📌 synchronized 키워드 Essential Java Classes > Concurrency)" data-og-descri..
[Spring Boot] Spring Boot에서 JPA QueryDSL 적용 방법
·
Spring
개요 QueryDSL을 통해서 JPQL을 동적으로 구성할 수 있는 법을 공부하고 Spring Boot에 적용하는 방법을 찾아보고 적용시킨 방법을 기록한다. QueryDSL은 JPA에서 공식적으로 제공하는 JPQL 빌더가 아니기 때문에 따로 구성해주어야 한다. 적용시킨 Spring Boot 버전과 의존성들은 다음과 같다. version : 3.2.4 java version : 17 Spring Data JPA lombok MariaDB Driver Spring MVC 환경이 다르면 문제가 발생할 수 있다는 점, 안된다면 댓글을 남겨주세요 본론 Gradle에 QueryDSL 의존성 추가 // query dsl 버전 명시해야 jakarta사용 (javax X) implementation 'com.queryds..
[Spring Boot] 도커 컨테이너에 환경에서 application.yml 민감한 정보 환경변수로 묶어내기
·
Spring
개요 프로젝트를 진행하면서 application.yml 파일에 입력되는 여러 민감정보(oauth token, database url, username, password 등..)이 github에 노출되는 것이 마음 한켠으로 불편했다. 그래서 docker container를 실행할 때 .env 파일을 통해 값들을 주입시켜주는 방법과 로컬 환경에서도 .env 파일을 통해 관리할 수 있는 방법을 소개하겠다. 본론 📌 .env 파일 만들기 확장자명 .env 파일을 먼저 만들어서 환경변수로 사용해야 한다. {환경변수명}={값} 위와 같이 간단한 형태로 작성해주면 된다. 아래는 예시이다. MY_DATA_SOURCE=jdbc:mariadb://127.0.0.1:3306/capstoneAuth MY_DATA_USERNA..
[Spring] 스프링 프로젝트에 카카오 로그인, 회원가입 구현 - (2)
·
Spring
서론 지난 포스트에 이어 스프링 프로젝트에서 리액트-스프링 부트간의 REST API를 통한 카카오 로그인과 카카오 회원가입 구현에 대해 소개하겠다. 본론 카카오 회원가입 카카오 서버로부터 정보를 받아와서 서비스에 정보를 등록해두고 회원가입 처리를 해준다. 프론트에서 인가 코드를 받아 서버로 전달 프론트 과정 설명으로 다루겠다. 프론트엔드에서 인가 코드를 발급받고 redirect uri로 리다이렉트되었을 때, 쿼리 파라미터에 담긴 code를 서버로 전달해주어야 한다. 위의 api를 통해 인가 코드를 발급받는다. 위의 3가지 쿼리 파라미터를 작성하고 GET 요청을 보내면 카카오 로그인 화면이 나타나고 로그인을 완료하면 설정한 redirect uri로 리다이렉트된다. redirect uri는 내 애플리케이션 ..