전체 글

전체 글

    [git/github] Git-Flow 전략을 프로젝트에 적용하기

    보호되어 있는 글입니다.

    [JPA] 객체지향 쿼리 언어

    자바 ORM 표준 JPA 프로그래밍 섹션10. 객체지향 쿼리 언어1 - 기본 문법 객체지향 쿼리 언어 소개 JPA는 다양한 쿼리 방법을 지원하는데 JPQL, JPA Criteria, QueryDSL, 네이티브 SQL 등이 있다. 혹은 JDBC API를 직접 사용하여 MyBatis, SpringJdbcTemplate과 함께 사용할 수도 있다. JPQL JPQL은 가장 단순한 조회 방법으로 EntityManager.find()랑 객체 그래프 탐색(a.getB().getC())가 가능하다. JPA를 사용하면 엔티티 객체를 중심으로 개발해야 하는데 이때 문제는 검색 쿼리이다. 검색을 할 때에도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 하는데 모든 DB 데이터를 객체로 변호나해서 검색하는 것은 불가능하다. ..

    [캠프/대회] "AWS winter camp" 교육 참여 및 1위 수상 후기

    숙명여대 SW중심대학과 AWS의 협업으로 2023년 12월 ~ 2023년 2월까지 약 3개월간 진행한 AWS winter camp에 참여하였습니다. 긴 캠프의 기간동안 배운 내용들과 프로젝트 1등 수상까지의 후기를 담아보려 합니다. AWS winter camp AWS winter camp는 클라우딩 컴퓨팅에 대한 기술을 배우는 것을 목표로 특히 AWS 클라우드 컴퓨팅 교육과 Elastic Search에 대한 교육이 진행되는 교육 캠프였습니다. 일주일 정도 오프라인으로 Elastic Search에 주력한 교육을 받은 후 2달 간 프로젝트를 진행하는 형식이었습니다. 지원 동기 저는 백엔드 개발자(SpringBoot)를 희망하여 이와 관련된 프로젝트을 다수 진행해본 경험이 있습니다. 아무래도 사이드 프로젝트이..

    [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를 붙여 사용할 수 없다. ..