본문 바로가기

jpa18

일일 단위로 환율 DB 저장을 위한 스케줄링 구현(with Spring boot) 들어가기 프로젝트 진행 중 예산 관리하는 기능에서 달러, 엔에 따라 변환해야 하는 기능이 있다.이를 위해 환율을 적용해야 하는데, 매일 변하는 환율에 따라 이를 적용해야 한다.이를 위해 한국수출입은행 환율 정보 조회 API를 사용하고자 한다.일일 1000번 호출이 가능하기에 데이터베이스에 저장해 놓았다가 환율 변환 시 저장된 값을 통해 변환을 할 수 있도록 할 것이다. 이를 위해선 데이터 베이스에 매일 환율이 업데이트가 필요하다. 그렇기에 스프링 부트에 내장되어 있는 @Scheduled 어노테이션을 사용할 것이다. 스프링 부트 및 JPA를 사용하였고 스프링 부트 버전은 3.2.5 이다.  본론 1. 한국수출입은행 환율 정보 조회 API  활용 우선 환율 정보를 조회하기 위한 API를 신청해야 한다. 아래.. 2024. 8. 11.
JPA를 활용한 연관관계 데이터 저장: getReferenceById()를 쓰는 이유 왜 findById() 대신 getReferenceById()를 쓰는가 Spring boot와 JPA를 통해 프로젝트를 진행하는 중, Banner 엔티티와 Comment 엔티티, Member 엔티티가 있고 Comment 엔티티가 Banner, Member 엔티티와 다대일 관계를 맺고 있다고 하자.  Comment를 저장하기 위해서는 Banner, Member 엔티티를 가져와야 한다. @Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class BannerComment {    @Id    @Column(name="banner_comment_id")    @GeneratedValue(strategy = GenerationType... 2024. 7. 29.
파일 업로드, 다운로드, 이미지 미리보기 구현(Spring boot With React) 들어가기  Spring boot로 프로젝트  도중 채팅방을 구현하면서 채팅 내용뿐만 아니라 파일을 업로드, 다운로드할 수 있도록 추가하려고 한다. 그러기 위해선 파일을 업로드 후 서버에서 파일을 보관하고, 다운로드 기능을 학습해야 한다. 이 글에선 간단한 프로젝트로 파일 업로드, 다운로드 기능을 Spring boot, React로 구현하는 과정을 담았다.HTTP를 통한 파일 업로드, 다운로드를 구현하였다. 업로드할 때는 MultiPartFile로 파일을 받고, 다운로드 시에는 byte[]와 같은 형태로 파일을 반환하도록 하였다.(또 다른 방법으로는 ResponseEntity가 있다고 하지만 이 글에서는 사용하지 않았다.)  java 17, spring boot는 3.2.3를 사용하였고 데이터베이스는 h2.. 2024. 5. 30.
Spring boot with React: STOMP를 통해 채팅 시스템을 구현해보자(With Mysql, MongoDB)(2) 들어가기  이 글은 https://khdscor.tistory.com/121에서 이어진다. 여기선 의존성, Config 파일 등 세부적인 파일을 다루지 않고 바로 비즈니스 로직을 작성한 과정을 담았다. 이에 대해 궁금한 것은 이전 글을 참고하길 바란다.이 글에선 Mysql과 MongoDB과 함께 Spring boot와 React 연동 및 STOMP를 통한 간단한 채팅 시스템을 구현하는 과정을 작성하였다. 참고로 Spring boot 버전은 '3.2.5'이다.구현한 내용은 크게 3가지로 아래와 같다.1. 채팅방 리스트 조회, 새 채팅방 생성 2. 채팅방 별 이전에 작성한 채팅 리스트 조회3. 메시지 전송Mysql에는 채팅방 테이블만, MongoDB에는 채팅 내용 컬렉션만을 생성할 것이다.서번 단(Sprin.. 2024. 5. 17.
JPA 영속성 컨텍스트는 어떻게 사용되는가 들어가기 예전에 JPA를 Spring Data JPA를 통해 다루면서 repository.save()를 할 시 반환 값으로 Primary Key 값이 포함된 객체를 반환하는 것에 의문이 생겼던 적이 있다. auto_increment 전략을 사용하기에 DB에 데이터가 들어간 이후에 Primary Key가 정해지기 때문이다. DB에 접근하기 전 영속성 컨텍스트에 데이터가 있으면 DB를 조회하지 않고 영속성 컨텍스트에서 데이터를 조회한다. 그리고 데이터를 저장 시 영속성 컨텍스트에 '쓰기 지연'이라는 기능 덕분에 INSERT 문을 모아두었다가 트랜잭션이 끝났을 때 한꺼번에 DB로 전송하도록 되어 있다. 그렇다면 repository.save()를 할 경우 inesrt 문은 트랜잭션이 끝났을 때 실행될 텐데 어떻.. 2024. 1. 14.
QueryDsl를 사용해보자.(With Spring boot 3.x.x, JPA) 들어가기 이 글은 Spring boot(3.0 이상), JPA에 QueryDSL을 사용하면서 새로 적용해 봤던 내용들을 정리한 것이다. 목차는 아래와 같다.1. QueryDSL은 무엇이며 왜 사용하는가?2. Spring boot에서 QueryDSL을 사용하기 위한 설정(Java 17, Spring boot 3.x.x를 기준)3. Spring Data JPA와 같이 사용하는 법4. DTO 객체로 값을 받는 법  본론1. QueryDSL은 무엇이며 왜 사용하는가? JPA를 사용할 때, 편의성을 위해 Spring Data JPA를 종종 사용하였다. 하지만 복잡한 쿼리를 작성해야 할 때면 @Query 어노테이션을 통해 JPQL을 직접 작성하곤 하였다. 로직이 복잡할수록 쿼리 문자열은 길어지며 가독성은 떨어진다... 2023. 11. 29.
springboot delete시 DB접근, 쿼리 횟수에 대한 고찰(mybatis, jpa) 이 글은 프로젝트를 진행하면서 delete를 진행 시 mybatis 및 jpa를 사용하였을 때 DB에 접근하는 횟수 및 쿼리 횟수에 대해 비교하여 주관적으로 작성한 글이다. Article 테이블이 DB에 저장되어 있다고 하자. 여기서 Ariticle 하나를 delete 하려고 한다. jpa는 영속성 컨테스트라는 1차 캐시를 가지고 있다. 그렇기에 트랜젝션 안에서 select를 통해 Article 테이블 정보를 객체로 가져오면은 이에 해당하는 정보가 영속성 컨테스트에 저장된다. 그리고 delete를 실행하면 쿼리를 따로 저장해 놓았다가 트랜젝션 종료 시 저장해 놓은 쿼리를 DB에서 전달하여 실행하게 된다. 즉, article를 select하기 위해 DB접근 1회, 쿼리 실행 1회, 트랜젝션이 종료되면 쿼리.. 2023. 6. 24.
JPA 양방향 연관관계 일 때의 저장 및 연관관계 편의 메서드 연관관계를 일대다, 다대일로 데이터를 다루는 경우가 많다. 만약 한 엔티티에서만 일대다, 다대일을 설정하면 단방향 연관관계이고 두 엔티티 모두 다대일, 일대다 설정을 한다면 양방향 연관관계이다. 양방향 연관관계를 할 때 외래 키 설정이 제대로 안된 경우가 있을 수 있는데 아래의 간단한 예시 코드를 보며 살펴보자. @Entity class Member { ... @ManyToOne @JoinColumn(name="TEAM_ID") private Team team; ... } @Entity class Team { ... @OneToMany(mappedBy = "team") private List members = new ArrayList(); ... } 위와 같이 Member 과 Team은 다대일 관계이며 .. 2021. 12. 14.
JPA column에 list를 넣는 방법(String 변환, @ElementCollection) 들어가기 Springboot와 JPA를 통해 프로젝트를 진행하던 중 간단한 값들의 리스트를 하나의 엔티티에 넣어두고 싶을 때가 있었다. 이는 '@OneToMany'를 통해서 새로운 테이블과 연관관계를 맺으면 쉽게 구현할 수 있지만... 새로운 테이블을 만들고 조인을 하는 등 복잡한 방법을 쓰고 싶지가 않았다. 오직 원하는 테이블만을 위한 리스트 필드를 가지고 싶은 것이다. 이럴 때 어떻게 사용할 수 있을까? 이 글에서는 간단하게 1. String으로의 변환 2. @ElementCollection 두가지 방법으로 소개하려고 한다. 본론 1. String 타입으로 변환 첫번째로 리스트를 Stirng 타입으로 변환하여 저장하는 것이다. 아래의 사진을 봐보자. 위는 특정 요청을 했을 때 응답 값을 JSON 형식.. 2021. 12. 11.