👩🏻‍💻 Programming 88

DB와 Transaction

Transaction이란? 데이터베이스에서 상태를 변화시키기 위해 수행하는 작업의 단위를 말한다. transaction은 일반적으로 사람의 정의하는 것에 따라 그 내용이 달라진다. 예시를 하나 살펴보자. 웹쇼핑몰에서는 사용자가 사용자가 결제하는 행위와 물건이 구입되는 행위가 동시에 이루어져야한다. 소비자의 결제가 진행되는 payment table에 insert가 이루어지고, 물건이 구입되는 order table에도 insert가 이루어져야한다. 만약 여기서 order table에 insert가 정상적으로 이루어지지 않으면 소비자의 돈만 빠져나가고 물건은 정상적으로 구매되지 않은다. 여기서는 payment table과 order table에 동시적으로 이루어지는 insert가 하나의 transaction이..

영속성 컨텍스트

영속성 컨텍스트란? 엔티티를 영구저장하는 환경이다. 어플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. Entity Manager를 통해 엔티티를 저장하거나 조회하면 Entity Manager는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. Entity의 생명주기 비영속 (new / transient) : 영속성 컨텍스트와 관계가 전혀 없음 영속(managed) : 영속성 컨텍스트에 저장된 상태 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) : 삭제된 상태 [비영속] Member member = new Member("David") 영속성 컨테스트와 관계가 전혀 없음 [영속] Member member = new Memb..

JPA - N대 1 연관관계

먼저 테이블 관계를 봐보자 user와 user_history의 관계는 1:N이다. user에는 회원정보가 저장되어있고, userhistory에는 특정 user의 정보 변경 내용이 담겨져있다. (ex : 이름, 이메일 주소 등) user와 user_history Entity를 봐보자 [User] public class User extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Enumerated(value = EnumType.STRING) private Gender gender; @NonNull private String name; @NonNull private String email; ..

Entity, DTO, 그리고 DAO

핵심 요약 [ Entity ] DB 테이블과 매핑되는 클래스 -> @Entity, @Column, @Id 등을 이용 DB 테이블 내에 존재하는 컬럼만을 속성(필드)으로 가져야 한다. 즉, 테이블의 컬럼 == Entity의 필드이다. Entity는 상속을 받거나 구현체이면 안된다. [ Entity 코드 예시 ] import javax.persistence.*; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) privae Long id; @Column(nullable = false) private String name; @Column(nullable = false) private String email; @..

Entity의 Listener

요약 Annotation Description @PrePersist insert 메소드가 호출되기 전에 실행 @PreUpdate merge 메소드가 호출되기 전에 실행 @PreRemove Delete 메소드가 호출되기 전에 실행 @PostPersist Persist 메소드가 호출된 이후에 실행 @PostUpdate Merge 메소드가 호출된 이후에 실행 @PostRemove Delete 메소드가 호출된 이후에 실행 @PostLoad Select 조회가 실행된 직후에 실행 [사용 예시] // User.java @PrePersist public void prePersist(){ System.out.println(">>>>> prePersist"); } @PostPersist public void postPe..

Entity의 기본 속성(annotation)

요약 Annotation Description @Entity 해당 객체는 JPA에서 관리한다고 선언. 단, Primary Key는 필수이다. @Table Table을 만든다. Data Migration을 할 때 Table 이름을 추가적으로 설정해서 사용한다. @Column 각 필드의 속성을 지정한다. @Transient DB에 해당 값이 반영되지 않는다. @Enumerated Java의 enum 타입을 엔티티 클래스의 속성으로 사용할 수 있다. @Entity 해당 객체는 JPA에서 관리함을 선언한다. 이때 PK(Primary Key)가 반드시 수반된다. [사용 예시] @Entity public class User { @Id // Primary Key @GeneratedValue // 아무것도 입력안하면 ..

Pageable과 Page Request

먼저 Paging이란? DB에 저장된 Entity들을 페이지로 나누는 것이다. 예를 들어 DB에 21개의 게시판 글이 작성되었다고 가정하자. 프론트에서 "DB에 있는 게시판을 5개씩 분류해서, 두 번째 파트를 줘!"라고 요청한다. 그러면 백엔드에서는 5개씩 분류하고, 분로된 게시판들의 두 번째 파트를 프론트에 넘겨준다. 위 상황과 같이, 일정 갯수만큼 분류하고 분류된 부분들 중 어떠한 부분을 보내주는 것이 Paging이다. Paging은 왜 필요할까? Paging은 Sort(정렬)의 개념을 갖고있다. 예컨데 DB 수가 적다면 List 형식으로 DB 전체목록을 가져와 쿼리메소드로 정렬을 하건, 원하는 부분만 sortging을 하건 성능의 큰 차이는 없을 것이다. 하지만 실제 서비스가 가지고 있는 기능들이 ..

JPA

JPA란? JPA가 포함하는 내용은 다양하다. 개발자에게 JPA가 무엇이냐고 묻는다면 다음과 같은 다양한 키워드들을 대답할 수 있다. JPA(JAVA Persistence API), Transaction, Spring DATA JPA, Lock, Entity, Repository, ORM(Object Relational Mapping), JDBC, RDB 등등 여기서는 JPA(Java Persistence API), Spring DATA JPA, Hibernate, ORM을 다루도록 하겠다. ORM이란? 우리가 프로그래밍한 객체와 데이터베이스 사이의 관계를 연결해주는 것을 ORM(Object Relational Mapping)이라고 한다. 컴퓨터는 똑똑하지만, 사람이 말할때 말하지 않아도 '눈치'를 통해..

RestTemplate과 WebClient

WebClient란? RestTemplate과 거의 흡사한 개념이다. RestTemplate RestTemplate이란? RestTemplate restTemplate = new RestTemplate(); 간편하게 Rest방식의 API를 호출할 수 있는 Spring 내장 클래스입니다. Spring 3.0부터 지원이 되며, Json, Xml 응답을 모두 받을 수 있습니.. astrid-dm.tistory.com 다만 RestTemplate보다 WebClient가 보다 늦게 등장했으며, 향후 RestTemplate은 Deprecated되고 WebClient가 RestTemplate을 대체할 예정이다. (출처 : https://docs.spring.io/spring-framework/docs/current/..

SpringBoot와 Swagger

Swagger란? OAS(=Open Api Specification)이라고도 불린다. 개발자가 REST API 서비스를 보다 쉽게 설계, 빌드, 문서화할 수 있도록 하는 프로젝트이다. Spring Boot에서 간단하게 springfox-boot-starter를 gradle dependencies에 추가함으로 사용할 수 있다. 단, 운영환경과 같이 외부에 노출되면 안되는 곳에서는 사용할때는 주의해야한다. 유사한 REST API 문서화 / 개발 프로젝트로는 GraphQL, RAML 등이 있다. 각 프로젝트의 차이점들은 해당 링크를 확인하면 된다. GraphQL과 Swagger(OAS), 그리고 RAML(RESTful API Modeling Language) Swagger(OAS = Open API speci..