-
JPA 사용법 차근차근 알아보기(1) - Entity, saveWeb/Backend 2020. 7. 28. 21:03
엔티티 매핑
@Entitiy - JPA를 사용해 테이블과 매핑할 클래스로 지정하는 어노테이션.
- 기본 생성자가 반드시 필요.
@ Table - 엔티티와 매핑할 테이블 지정하는 어노테이션.
- name : 테이블명 지정할 때 사용. (default는 엔티티명 , Table(name="테이블명")와 같은 형식)
기본키 매핑
기본키를 할당하는 방법으로는 두가지가 있습니다.
- 직접할당 : @Id (@Id로 지정한 id 필드에 Set메소드로 직접 할당)
- 자동생성 : @GeneratedValue을 추가적으로 작성.
데이터베이스가 자동으로 할당해주는 방법. 4가지 전략이 존재
- IDENTITY : 기본 키 생성을 데이터베이스에 위임하는 방법 (데이터베이스에 의존적)
- 주로 MySQL, PostgresSQL, SQL Server, DB2에서 사용. - SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당하는 방법 (데이터베이스에 의존적)
- 주로 시퀀스를 지원하는 Oracle, PostgresSQL, DB2, H2에서 사용.
- @SequenceGenerator를 사용하여 시퀀스 생성기를 등록하고, 실제 데이터베이스의 생성될 시퀀스이름을 지정해줘야 합니다. - TABLE : 키 생성 테이블을 사용하는 방법
- 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만드는 방법.
- 테이블을 사용하므로, 데이터베이스 벤더에 상관없이 모든 데이터베이스에 적용이 가능합니다. - AUTO : 데이터베이스 벤더에 의존하지 않고, 데이터베이스는 기본키를 할당하는 벙법
- 데이터베이스에 따라서 IDENTITY, SEQUENCE, TABLE 방법 중 하나를 자동으로 선택해주는 방법.
- 예를들어, Oracle일 경우 SEQUENCE를 자동으로 선택해서 사용합니다. 따라서, 데이터베이스를 변경해도 코드를 수정할 필요가 없습니다.
@GeneratedValue(strategy = GenerationType.IDENTITY)와 같은형식
필드와 컬럼명 매핑
@Column : 객체 필드를 테이블 컬럼과 매핑시킨다.
- name(default 필드명) : 필드와 매핑할 컬럼명
- nullable(default true) : null 허용 여부.
(@NotNull을 사용하는게 더 안전.
@Column(nullable=false)와 @NotNull은 제약조건을 검사해주는건 동일하지만
NotNull은 유효성 검사를 해주고 nullable은 유효성 검사를 해주지 않는 차이가 있다.)
- unique(default false) : 컬럼에 유일값 허용 여부.
- length(default 255) : 문자길이 제약조건. String 필드에만 사용한다.
- columnDefinition : 직접 정의 "varchar(10) default 'test'". 사용하는 DB 종류에 종속될 수 있으므로 지양한다.
- insertable,updatable(default true) : 읽기전용시 false로 설정하여 DB에 저장/수정이 불가하도록 지정한다.자바 기본(primitive)타입에 @Column을 사용하면 nullable = false로 지정하는 것이 안전하다.
BoardEntity
package com.web.curation.model; import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import lombok.ToString; @Entity @Setter @Getter @ToString public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키 매핑 db에서 자동증분으로 설정 private int articleno; // 컬럼 어노테이션 없으면 컬럼명의 디폴트가 필드명이 됨 private String content; @Column(insertable = false, updatable = false) // 일기전용시 false private LocalDateTime articleDate; @NotNull // null 허용여부 false private String articleUser; private int favoriteCnt; }테이블 컬럼명이 articleUser인데
변수명을 articleUser로 적으면 article_user로 인식
ArticleUser -> article_user로 인식
즉, snake 컬럼명으로 인식한다.
SpringBoot 1.5.2 에서 디폴트 생성이 Model에서
설정되어 있는 경우 camel이 아닌 snake 필드명을 생성시켜준다고 한다.@Column(name="articleUser") 로 하여도 적용 x
application.properties에
spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl를 추가하면 해결 (변수명 그대로 사용)
Controller 부분
package com.web.curation.controller.mypage; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.web.curation.dao.user.BoardDao; import com.web.curation.dao.user.UserDao; import com.web.curation.model.BasicResponse; import com.web.curation.model.Board; import com.web.curation.model.user.SignupRequest; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; @ApiResponses(value = { @ApiResponse(code = 401, message = "Unauthorized", response = BasicResponse.class), @ApiResponse(code = 403, message = "Forbidden", response = BasicResponse.class), @ApiResponse(code = 404, message = "Not Found", response = BasicResponse.class), @ApiResponse(code = 500, message = "Failure", response = BasicResponse.class) }) @CrossOrigin(origins = { "*" }) @RestController @RequestMapping("/board") public class BoardController { @Autowired BoardDao boardDao; @PostMapping public Object writeBoard(@Valid @RequestBody Board board) { final BasicResponse result = new BasicResponse(); if (boardDao.save(board)==null) { result.status = true; result.data = "fail"; } else { result.status = true; result.data = "success"; } return new ResponseEntity<>(result, HttpStatus.OK); } }Dao 인터페이스
(save만 테스트 해보는거라 아무것도 없음)
package com.web.curation.dao.user; import org.springframework.data.jpa.repository.JpaRepository; import com.web.curation.model.Board; public interface BoardDao extends JpaRepository<Board, String>{ }
정상적으로 성공하고 db에 무사히 저장되었다.
롬복에 관해서는
개인 Toy 프로젝트가 아닌 실무 프로젝트에서는 가급적 @Getter, @Setter, @ToString 만 사용하고 그 외의 것들 사용은 자제하거나 매뉴얼을 잘 읽어보고서 보수적으로 사용하는게 좋다고 한다.
'Web > Backend' 카테고리의 다른 글
스프링부트 @Component 와 @Configuration , @Bean (0) 2021.01.31 Springboot - ApplicationTest에서의 에러 // test 건너 뛰기 (0) 2020.11.04 JWT ( JSON WEB TOKEN ) 란 ?? (0) 2020.10.03 nginx (1) 특징 공부하기 (0) 2020.10.01 스칼라 서브쿼리, 연관 서브쿼리 동작원리 및 실행순서 (0) 2020.08.10 - IDENTITY : 기본 키 생성을 데이터베이스에 위임하는 방법 (데이터베이스에 의존적)