헤르메스 LIFE

[Spring Boot] JPA에서 Boolean 처리 ( @Converter, @Convert ) 본문

Spring Boot Framework

[Spring Boot] JPA에서 Boolean 처리 ( @Converter, @Convert )

헤르메스의날개 2023. 4. 25. 16:42
728x90

JPA를 사용 중 Boolean 처리를 어떻게 해야 할까요? Native Query에 익숙해져 있어서, 발상의 전환이 쉽지 않습니다.

검색해보니 아래에서 소스를 담아왔습니다.

출처 : https://memostack.tistory.com/194

 

Spring Boot, JPA에서 boolean 처리 (@Converter, @Convert 사용)

엔티티에서는 java의 boolean을 사용하고, Database에서는 Y 또는 N으로 처리하고 싶을때, @Converter 어노테이션을 사용하여 해결할 수 있다. 컨버터 객체 생성 BooleanToYNConverter.java @Converter public class Boolea

memostack.tistory.com


BooleanToYNConverter.java

package octopus.base.converter;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter
public class BooleanToYNConverter implements AttributeConverter<Boolean, String> {
    /**
     * Boolean 값을 Y 또는 N 으로 컨버트
     *
     * @param attribute boolean 값
     * @return String true 인 경우 Y 또는 false 인 경우 N
     */
    @Override
    public String convertToDatabaseColumn(Boolean attribute) {
        return (attribute != null && attribute) ? "Y" : "N";
    }
    
    /**
     * Y 또는 N 을 Boolean 으로 컨버트
     *
     * @param yn Y 또는 N
     * @return Boolean 대소문자 상관없이 Y 인 경우 true, N 인 경우 false
     */
    @Override
    public Boolean convertToEntityAttribute(String yn) {
        return "Y".equalsIgnoreCase(yn);
    }
}

TBoardM.java

package octopus.bbs.dto;

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.Proxy;
import org.springframework.util.Assert;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import octopus.base.converter.BooleanToYNConverter;
import octopus.base.model.BaseEntity;

@Getter // getter를 자동으로 생성합니다.
// @Setter // 객체가 무분별하게 변경될 가능성 있음
// @ToString(exclude = { "crtId", "crtDt", "mdfId", "mdfDt" }) // 연관관계 매핑된 엔티티 필드는 제거. 연관 관계 필드는 toString()에서 사용하지 않는 것이
// // 좋습니다.
@ToString(callSuper = true)
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 인자없는 생성자를 자동으로 생성합니다. 기본 생성자의 접근 제어자가 불명확함. (access =
                                                   // AccessLevel.PROTECTED) 추가
@DynamicInsert // insert 시 null 인필드 제외
@DynamicUpdate // update 시 null 인필드 제외
// @AllArgsConstructor // 객체 내부의 인스턴스멤버들을 모두 가지고 있는 생성자를 생성 (매우 위험)
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" }) // Post Entity에서 User와의 관계를 Json으로 변환시 오류 방지를 위한 코드
@Proxy(lazy = false)
@Entity // jpa entity임을 선언. 실제 DB의 테이블과 매칭될 Class
@Table(name = "T_BOARD_M")
public class TBoardM extends BaseEntity {
    private static final long serialVersionUID = 1L;
    
    @Id // PK 필드임
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; // ID
    
    @Column(nullable = false, length = 200)
    private String title; // 제목
    
    @Column(name = "contents", length = 5000)
    private String contents; // 내용
    
    private Integer readCnt; // 조회수
    
    @Column(length = 1)
    @Convert(converter = BooleanToYNConverter.class)
    private Boolean noticeYn; // 공지여부
    
    @Builder
    public TBoardM(Long id, String title, String contents, Integer readCnt, Boolean noticeYn,
            String crtId,
            String mdfId) {
        Assert.hasText(title, "Title must not be empty");
        Assert.hasText(crtId, "crtId must not be empty");
        Assert.hasText(mdfId, "mdfId must not be empty");
        
        this.id       = id;
        this.title    = title;
        this.contents = contents;
        this.readCnt  = readCnt;
        this.noticeYn = noticeYn;
        super.crtId   = crtId;
        super.mdfId   = mdfId;
    }
    
    /**
     * 게시판 Update
     */
    public void updateBoard(BoardDto dto) {
        this.title    = dto.getTitle();
        this.contents = dto.getContents();
        this.noticeYn = dto.getNoticeYn();
        super.mdfId   = dto.getMdfId();
    }
    
}

LocalDateTimeToStringConverter.java

package octopus.base.converter;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Converter
public class LocalDateTimeToStringConverter implements AttributeConverter<LocalDateTime, String> {
    /**
     * LocalDateTime 값을 String 으로 컨버트
     *
     * @param attribute boolean 값
     * @return String true 인 경우 Y 또는 false 인 경우 N
     */
    @Override
    public String convertToDatabaseColumn(LocalDateTime date) {
        log.debug("LocalDateTime :: {}", date);
        return (date != null) ? date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
                : "";
    }
    
    /**
     * String 을 LocalDateTime 으로 컨버트
     *
     * @param yn Y 또는 N
     * @return Boolean 대소문자 상관없이 Y 인 경우 true, N 인 경우 false
     */
    @Override
    public LocalDateTime convertToEntityAttribute(String value) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime     dateTime  = null;
        
        log.debug("value :: {}", value);
        
        try {
            value = value.replaceAll("-", "").replaceAll("/", "").replaceAll(":", "")
                    .replaceAll(".", "");
            
            dateTime = LocalDateTime.parse(value, formatter);
        } catch (Exception e) {
            return null;
        }
        
        return dateTime;
    }
}

https://memostack.tistory.com/194

 

Spring Boot, JPA에서 boolean 처리 (@Converter, @Convert 사용)

엔티티에서는 java의 boolean을 사용하고, Database에서는 Y 또는 N으로 처리하고 싶을때, @Converter 어노테이션을 사용하여 해결할 수 있다. 컨버터 객체 생성 BooleanToYNConverter.java @Converter public class Boolea

memostack.tistory.com

 

728x90