ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA 사용법 차근차근 알아보기(1) - Entity, save
    Web/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 만 사용하고 그 외의 것들 사용은 자제하거나 매뉴얼을 잘 읽어보고서 보수적으로 사용하는게 좋다고 한다.

     

Designed by Tistory.