분류 전체보기
[JPA] 값 타입 (기본값, 임베디드 타입, 불변객체, 비교, 컬렉션)
자바 ORM 표준 JPA 프로그래밍 섹션9. 값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체로 데이터가 변해도 식별자로 지속해서 추적이 가능하다. 예를 들어 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식이 가능한 경우이다. 추가로 공유가 가능하며 생명 주기 관리가 가능하다. 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체이다. 식별자가 없고 값만 있기 때문에 변경 시 추적이 불가능하다. 예를 들면 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체되는 경우이다. 추가로 생명 주기가 엔티티에 의존되며 공유하지 않는 것이 안전하며 불가피할 경우 복사해서 사용할 수 있다. 이런 특성 때문에 불변 객체로 만드는 것이 ..
[JPA] 프록시, 즉시/지연 로딩, 영속성 전이(CASCADE), 고아 객체
자바 ORM 표준 JPA 프로그래밍 섹션8. 프록시와 연관관계 관리 프록시 아래와 같은 상황에서 Member을 조회할 때 Team도 매번 조회해야 할까? 답은 비즈니스적인 상황마다 다르다. 따라서 Member을 조회할 때마다 Team을 무조건 조회하는 것이 자원 낭비일 수 있다. 이런 문제를 JPA는 지연로딩과 프록시로 해결한다. JPA에는 em.find() 말고도 em.getReference() 가 있다. em.find()는 DB를 통해서 실제 엔티티 객체를 조회하는 것이고 em.getReference()는 DB 조뢰를 미루는 가짜(프록시) 엔티티 객체를 조회하는 것이다. Member member = new Member(); member.setName("bella"); em.persist(member)..
[SpringBoot(Java), AWS] 이미지 로딩 속도 개선 (CloudFront, S3)
포토 캘린더 서비스 (Cookiee-) 를 진행하며 이미지 로딩 속도 개선을 한 경험을 적어보려 합니다. 문제 상황 진행 중인 프로젝트에서 이미지를 로딩하는 모든 API 호출에 있어서 이미지 로딩이 너무.. 느린 것이 문제 상황이었다. WiFi가 불안정한 곳에서 사용자에게 서비스를 설명할 때에는 체감 5초까지 걸릴 정도로 이미지 로딩이 오래 걸리었다. 하지만 우리 서비스는 이미지 관련 서비스이기 때문에 꼭 이 부분을 고쳐야 했다. 본래 서비스는 S3만을 이용하여 이미지 작업을 처리하였다. SpringBoot에서 이미지를 S3 버킷에 저장하고 S3 버킷 내 객체 URL을 DB에 저장하였다. 프론트에서 이미지 로딩 API를 호출할 때에도 S3 버킷 내 객체 주소를 통해 화면에 띄웠다. 해결 아이디어 이를 해..
[JPA] 상속관계 매핑
자바 ORM 표준 JPA 프로그래밍 섹션7. 고급매핑 상속관계 매핑 관계형 DB는 상속관계가 없다. 대신 슈퍼타입, 서브타입 관계라는 모델링 기법이 있는데 이가 객체 상속 관계와 유사하다. 따라서 상속 관계 매핑은 객체의 상속 구조와 DB의 슈퍼타입, 서브타입 관계를 매핑하는 것이다. 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED: 조인 전략 SINGLE_TABLE: 단일 테이블 전략 TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name=“DTYPE”) 부모 입장에서 DTYPE의 기본값은 자식의 Entity명이다. @DiscriminatorValue(“XXX”) 자식 입장에서 자신의 DTYPE ..
[JPA] 다양한 연관관계 (다대일, 일대다, 일대일, 다대다)
자바 ORM 표준 JPA 프로그래밍 섹션6. 다양한 연관관계 매핑 연관관계 매핑 시 고려사항 다중성 다대일 @ManyToOne 일대다 @OneToMany 일대일 @OneToOne 다대다 @ManyToMany DB 관점에서 다중성을 고려하여 어노테이션을 붙이면 된다. 다대다는 실무에서 사용하지 않는다. 2. 단방향 vs 양방향 테이블은 외래키 하나로 양쪽 조인이 가능하며 사실 방향이라는 개념이 없다. 객체는 참조용 필드가 있는 쪽으로만 참조가 가능하며 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이다. 3. 연관관계의 주인 테이블은 외래키 하나로 두 테이블이 연관관계를 맺는다. 객체의 양방향 관계는 A→B, B→A 처럼 참조가 2군데이다. 따라서 둘 중 테이블의 외래키를 관리할 곳을 지정해야 한다...
[JPA] 연관관계 매핑 (단방향, 양방향, 연관관계의 주인)
자바 ORM 표준 JPA 프로그래밍 섹션5. 연관관계 매핑 기초 기본 용어 1. 방향 (Direction) : 단방향, 양방향 2. 다중성 (Multiplicity) : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 3. 연관관계의 주인 (Owner) : 객체 양방향 연관관계는 관리 주인 필요 테이블에 맞춘 모델링 예제 시나리오 회원과 팀이 있다. 회원은 하나의 팀에만 소속될 수 있다. 회원과 팀은 다대일 관계다. 객체를 테이블에 맞추어 모델링할 경우 테이블에 맞춘 모델링의 경우, 객체와 테이블 연관관계는 아래와 같다. 객체를 테이블에 맞추어 모델링할 경우 참조 대신에 외래 키를 그대로 사용해야 하므로 Entity 관련 코드는 아래와 같다. @Entity public class M..
[JPA] 엔티티 매핑 (매핑 어노테이션, DDL, 기본키 전략)
자바 ORM 표준 JPA 프로그래밍 섹션4. 엔티티 매핑 매핑 어노테이션 1. 객체와 테이블을 매핑하는 어노테이션 : @Entity, @Table 2. 필드와 컬럼을 매핑하는 어노테이션 : @Column 3. 기본키를 매핑하는 어노테이션 : @Id 4. 연관관계를 매핑하는 어노테이션 : @ManyToOne, @JoinColumn 객체와 테이블 매핑 @Entity @Entity가 달린 클래스는 JPA가 관리한다. 따라서 JPA를 사용하여 테이블과 매핑할 클래스는 @Entity를 필수적으로 사용해야 한다. 이때 주의점은 파라미터가 없는 public 또는 protected 기본 생성자는 필수로 있어야 한다. final, enum, interface, inner 클래스는 @Entity를 붙여 사용할 수 없다. ..
[알고리즘] 그리디(Greedy) 알고리즘
그리디(Greedy) 그리디 알고리즘은 한마디로 "현재 상황에서 지금 당장 좋은 것만 고르는 방법"이라고 표현할 수 있다. 미래는 생각하지 않는 것이다. 그리디 알고리즘은 기준에 따라 좋은 것을 선택하는 알고리즘이기 때문에 문제에서 "가장 큰 순서대로", "가장 작은 순서대로"와 같은 기준을 제시하기도 한다. 이에서 볼 수 있듯이 주로 정렬 알고리즘과 함께 출제되기도 한다. 그리디 알고리즘을 풀 때에는 결정한 문제 풀이 방법이 그때 당시의 최선의 선택이 전체에 걸쳐서도 최선인지를 확인하여야 한다. 그리디 알고리즘은 이런 특성 때문에 항상 최적의 값을 보장하지는 않는다. 따라서 최적의 값에 근사한 값을 목표로 하는 근사적인 방법이다. 그리디 알고리즘의 조건 1. 탐욕스런 선택 조건 (Greedy Choic..
[자바 ORM 표준 JPA 프로그래밍] 섹션3. 영속성 관리 - 내부 동작 방식
영속성 컨텍스트 영속성 컨텍스트의 의미 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 의미를 가진다. 이는 DB에 저장한다는 의미보다는 영속성 컨텍스트를 통해 엔티티를 영속화 한다는 의미를 가진다. 따라서 엔티티를 영속성 컨텍스트에 저장한다는 뜻이다. 이후 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있다. 엔티티매니저와 영속성 컨텍스트는 N:1의 관계를 가진다. 엔티티의 생명주기 1. 비영속 (new, transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 2. 영속 (managed) : 영속성 컨텍스트에 관리되는 상태 엔티티 매니..
[자바 ORM 표준 JPA 프로그래밍] 섹션2. JPA 시작하기
Hello JPA - 프로젝트 생성 강의와 다르게 진행한 점 DB 사용을 H2가 아닌 MySQL 사용 pom.xml 설정 dependency에 사용할 라이브러리를 적는다. 4.0.0 org.example ex1-hello-jpa 1.0-SNAPSHOT Archetype - ex1-hello-jpa http://maven.apache.org org.hibernate hibernate-entitymanager 5.3.10.Final mysql mysql-connector-java 8.0.28 라이브러리 버전 선택하는 방법 아래 페이지에서 내가 선택한 스프링 부트 버전의 Reference Docs > Dependency Versions를 확인한다. https://spring.io/projects/spring-..