본문 바로가기

Spring/Spring Data JPA

(14)
jpa app 운영 배포 전략 jpa app 운영 배포 전략 jpa로 앱을 만들고 백엔드 서버를 운영 할 때 db에 컬럼이 추가 되는 경우가 있습니다. jpa같은 경우는 서버가 뜰 때 db하고 entity하고 매핑을 한 다음에 뜹니다. 예를들면 entity에 phone이라는 필드가 있지만 db에는 없는 경우는 매핑이 되지 않아서 서버가 뜨지 않습니다. 그래서 jpa에는 hibernate.ddl-auto에 update라는 옵션이 있는데 prod에는 보통 update는 해놓지 않고 validate로 해놓습니다. 이 옵션을 update로 해놓고 수정한 서버를 재부팅 하면 entity하고 db의 field와 비교를 해서 db의 field에 alter를 해서 컬럼을 추가합니다. 왠지 이야기만 들어도 문제가 생길 것 같지 않으신가요? 컬럼이 추..
jpa에서 복수키 만들기(key 2개), 복수키를 사용할 경우 길이 문제 JPA에서 복수키 만들기@IdClass(OhlcvHour.OhlcvHourKey.class) public class OhlcvHour { @Id private String currencyPair; @Id private LocalDateTime timeToHours; @EqualsAndHashCode @Embeddable static class OhlcvHourKey implements Serializable { @Column(columnDefinition = "varchar(10)") private String currencyPair; @Column(name = "TIME_TO_HOURS", nullable = false) private LocalDateTime timeToHours; } }복수키를 만들..
jpa 강좌 주제 영속성 컨텍스트란? 영속성 컨텍스트를 쓰는 이유 준영속성이란? method query db와 mapping하는법 ddl-auto 옵션에 따라 작동하는 방법 join하는 방법. 1:1, 1:N, N:N @Join을 위한 domain 설계 - match와 team id를 예제로 기존에 있는 table을 jpa로 index잡는법 slow query는 어떻게 해결할 것인가? 캐싱(caching)은 어떻게 할 것인가? query dsl 어려운 점 join을 걸었을 때 속도 이슈 왜냐하면 join걸었던 table에도 모두 select를 걸어줌 데이터를 쓰지 않을 경우 손해 db가 변경 되었을 때 초보자가 만지면 데이터가 모두 날아갈 수 있다. group by문제 jpa에서 group by를 쓰기 어려움 테스트 하는..
Spring Data Jpa - mysql LocalDateTime은 timestamp로, BigDecimal은 decimal mapping하기 jpa로 mysql을 쓸 때 mapping을 아래와 같이 하였다. timestamp로 mapping하기 @Column(nullable = false, name = "TIME_TO_12HOURS", columnDefinition = "TIMESTAMP(3)") private LocalDateTime timeTo12Hours; decimal로 mapping하기 @Column(nullable = false, precision = 36, scale = 18) private BigDecimal open; BigDecimal은 그냥 mapping하면 decimal로 mapping된다. public class OhlcvMaker { public Ohlcv make(String ohlcvString) { // Stri..
Spring Data Jpa에서 LocalDateTime이용해서 자동으로 createdAt만들기 Spring Data Jpa에서 LocalDateTime이용해서 자동으로 createdAt만들기 개요 쇼핑몰에서 사용자가 물건을 구매 한다고 했을 때 언제 구매를 했는지 그리고 결제를 했다면 언제 결제를 했는지 등 날짜, 시간에 관한 정보가 꼭 필요한 table들이 있습니다. 여기에서 트렌젝션이 발생한 날짜와 시간을 기록하게 하고 싶을 때 아래와 같이 Object를 만들어 주면 날짜를 현재 시간으로 만들어서 기록 할 수 있습니다. import lombok.Data; import javax.persistence.*; import java.time.LocalDateTime; @Data @Entity public class Salary { @Id @GeneratedValue(strategy = Generati..
@SpringBootTest와 @DataJpaTest 차이점 @SpringBootTest와 @DataJpaTest 차이점Spring Application(스프링 어플리케이션)은 ApplicationContext이다. 스프링의 기본 컨셉이 ApplicationContext에 Bean(Object)들을 미리 로드 해놓고 사용하는 컨셉이기 때문에 이걸 로딩하는것도 시간이 꽤 걸린다. 특히 테스트를 계속 돌리면서 개발할때는 한번 올려버리는게 아니고 계속 올려야 하니까 한줄 수정 하고 결과를 보기 까지 시간이 올래 걸리면 지친다.그래서 몇가지 구분을 해놓은게 있다.결론부터 이야기 하면 @DataJpaTest는 @Component를 스캔하지않는다.그래서 @Component붙혀놓은 Class를 함께 사용하려면 @SpringBootTest를 사용하면 된다. @DataJpaTes..
IntelliJ + Gradle로 Spring Data Jpa @ManyToOne 양방향 Mapping하기 Spring Data Jpa @ManyToOne 양방향 Mapping하기 Spring Data Jpa는 굉장히 괜찮은 프레임웍이다. 기능이 많고 유연한데 그만큼 제약이 많고 잘 알고 써야 한다.가장 어려운것은 Mapping이다. 소스코드는 여기https://github.com/Kyeongrok/baseball_mapping 목차는 다음과 같다.1.Project빌드2.필요한 라이브러리 선택- JPA, MySql, JDBC, H23.application-test.yml 만들기5.Team 엔티티(Entity) 만들기6.Lombok 설정7.TeamRepository 만들기8.TeamRepository test code 만들기 인텔리J를 실행 한다.Create Project를 누른다. 좌측 Spring Initi..
Spring Data Jpa @Discriminator 다대일 Mapping Spring Data Jpa @Discriminator 다대일 Mapping 중요한 내용@ManyToOne은 parent를 save 할 때 먼저 Many쪽에 있는 row들을 insert한 다음에 parent를 save할 수 있다.Parent에서 @OneToMany(mappedBy = "parentName") 이런식으로 카멜케이스를 써야함.@OneToMany(mappedBy = "parent_name") 이렇게 쓰면 매핑이 안됨 났던 에러들1.Could not determine type for- Parent에 @OneToMany(mappedBy="parent_table_name")를 빼면 난다. 2.mappedBy reference an unknown target entity property- 알수 없는 ..