Spring
-
JPA - 연관관계 매핑Spring/JPA 2022. 3. 8. 18:10
연관관계 매핑 단방향 연관관계 양방향 연관관계 객체를 테이블에 맞추어 모델링하면 연관관계를 만들 수 없지만 테이블은 외래 키로 조인을 사용하여 연관된 테이블을 찾을 수 있다. 이런 차이 때문에 객체를 테이블에 맞춘 모델링은 좋은 방법이 아니다. @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") private Long teamId; … } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; … } 위와 같이..
-
JPA - 엔티티 매핑Spring/JPA 2022. 3. 8. 14:26
엔티티 매핑 데이터베이스 스키마 자동 생성 객체와 테이블 매핑 필드와 컬럼 매핑 기본 키 매핑 - 직접 할당, 자동할당(@GeneratedValue) @GeneratedValue의 identity 전략 데이터베이스 스키마 자동 생성 DDL을 애플리케이션 실행 시점에 자동 생성 객체 중심으로 개발이 가능 각 데이터베이스에 맞는 적절한 DDL 생성 생성된 DDL은 개발 장비에서만 사용하는게 좋다. (운영서버에서 사용하기 위해서는 적절히 다듬은 후 사용해야한다) spring.jpa.hibernate.ddl-auto 옵션 설명 사용 시점 create 기존 테이블 삭제 후 다시 생성 (DROP + CREATE) 개발 초기 단계 create-drop 테이블 생성 후 종료 시점에 테이블 DROP (CREATE + D..
-
JPA - 영속성 컨텍스트Spring/JPA 2022. 3. 7. 16:57
영속성 컨텍스트 1차 캐시 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연(Transactional write-behind) 변경 감지(Dirty Checking) 지연 로딩(Lazy Loading) 플러시 준영속 상태 1차 캐시 영속 상태인 Entity, 즉, 영속 컨텍스트에서 관리되는 Entity는 조회 시 1차 캐시에서 가져온다. 1차 캐시에 저장되어 있지 않은 Entity는 데이터베이스에서 조회한 후 1차 캐시에 저장한다. Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); //1차 캐시에 저장됨(영속) em.persist(member); //1차 캐시에서 조회 Member findMembe..
-
JPA - JPA의 내부 동작과 Entity의 생명주기Spring/JPA 2022. 3. 7. 14:52
JPA의 내부 동작과 Entity의 생명주기 JPA의 내부 동작 Entity의 생명주기 JPA의 내부 동작 요청이 들어올 때 JPA가 내부적 처리되는 과정은 아래의 그림과 같다. 요청이 들어오면 EntityManagerFactory가 각 요청마다 EntityManger를 생성해주고, EntityManager는 커넥션 풀을 이용해 DB에 접근한다. JPA의 강점 JPA는 특정 데이터베이스에 종속되지 않는다. 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 다르기 때문에 JPA에서는 hibernate.dialect로 특정 데이터베이스를 지정할 수 있다. H2 : org.hibernate.dialect.H2Dialect Oracle 21g : org.hibernate.dialect.Oracle12cDial..
-
JPA - JPA(Java Persistence API)Spring/JPA 2022. 3. 7. 11:54
JPA(Java Persistence API) 자바 진영의 ORM 기술 표준 애플리케이션과 JDBC 사이에서 동작한다. ORM(Object-Relational Mapping 객체 관계 매핑 객체는 객체지향 관점으로 설계, RDB는 RDB관점으로 설계 ORM 프레임워크가 중간에서 매핑 JPA 동작 저장 저장할 Entity 객체를 JPA에 전달 JPA는 Entity를 분석하여 INSERT SQL 생성 JDBC API을 사용하여 쿼리 전달 조회 조회할 테이블의 PK인 id를 JPA에 전달 SELECT SQL 생성 JDBC API 사용하여 해당 쿼리 전달 결과 값 Entity에 매핑하여 전달 JPA의 장점 생산성 저장 : jpa.persist(member) 조회 : jpa.find(memberId) 수정 : m..
-
JPA - JPA의 등장Spring/JPA 2022. 3. 7. 11:05
JPA의 등장 웹 애플리케이션을 개발할 때 객체에 저장되어있는 데이터들을 SQL로 변환하고, RDB에 연결하여 작성한 쿼리문을 전송하여 RDB에 저장한다. 말로 했을 때는 참 쉬워 보이지만 객체와의 관계와 테이블 간의 관계에서의 차이가 존재하기 때문에 고려해야 할 사항들이 많다. 만약에 Item을 상속받는 Album 객체를 RDB에 저장한다고 생각해보자. RDB에는 ITEM 테이블과 ALBUM 테이블을 따로 관리하기 때문에 저장을 하기 위해서는 Item 객체와 Album 객체를 분리하여 각 테이블에 저장할 수 있도록 쿼리문을 작성하여 전달해야 한다. 반대는 조회는 어떨까? 조회 역시 Album을 조회하기 위해서는 ITEM 테이블과 ALBUM 테이블을 조인하여 가져온 데이터들을 각각의 객체를 생성하여 매핑..
-
Spring MVC - 파일 업로드와 다운로드 구현해보기Spring/Spring MVC 2022. 2. 18. 15:56
파일 업로드와 다운로드 구현해보기 파일 업로드와 다운로드 구현 시 주의할 사항들이 있다. 직접 구현을 해보면서 주의 사항들을 살펴보자. 파일 업로드 업로드된 파일 뷰에서 보여주기 업로드된 파일 뷰에서 다운로드하기 파일 업로드 도메인 객체 생성 우선 데이터 베이스에 저장할 도메인 객체를 생성해준다. @Data public class Item { private Long id; private String itemName; private UploadFile attachFile; private List imageFiles; } 파일 관리 클래스 실제 파일명으로 서버 내부에 파일을 저장하면 안 된다. 그 이유는 기존에 서버에 저장되어있던 파일명으로 업로드 요청을 받게 되면 파일명이 같기 때문에 기존 파일명에 새로 ..
-
Spring MVC - Spring에서 제공하는 MultipartFile을 이용한 파일 업로드Spring/Spring MVC 2022. 2. 17. 22:19
Spring에서 제공하는 MultipartFile을 이용한 파일 업로드 파일 업로드는 Spring에서 제공하는 MultipartFile 인터페이스를 이용하면 Servlet으로 했던 것과는 비교할 수 없을 정도로 편리하게 이용할 수 있다. MultipartFile 인터페이스 getName() : 넘어온 파라미터 명 getOriginalFilename() : 업로드 파일명 getContentType : 파일의 ContentType isEmpty() : 업로드된 파일이 비어있는지 확인 getSize() : 파일의 바이트 사이즈 getBytes() : 바이트 배열로 저장된 파일의 내용 getInputStream() : 파일의 내용을 읽기 위한 InputStream 반환 transferTo() : 파일 저장 pu..