저작권 안내: 저작권자표시 Yes 상업적이용 No 컨텐츠변경 No

스프링5 입문

JSP 2.3

JPA 입문

DDD Start

인프런 객체 지향 입문 강의

'JPA 2.1'에 해당되는 글 1건

  1. 2014.11.11 JPA 2.1 AttributeConverter를 이용한 커스텀 값 타입 사용 (3)

JPA를 이용해서 코딩 장난을 하던 중 도메인 모델상의 InetAddress를 DB 테이블의 VARCHAR 타입 컬럼에 매핑해야 할 요구가 생겼다. JPA 2.1 버전을 사용하고 있었는데, JPA 2.1에서 제공하는 AttributeConverter라는 걸 사용하면 매우 간단하게 InetAddress 프로퍼티 타입과 DB VARCHAR 타입 사이의 매핑을 처리할 수 있는 걸 알 수 있었다.


사용법은 간단하다. 먼저 AttributeConverter 인터페이스를 구현한 컨버터 클래스를 구현현다.


import javax.persistence.AttributeConverter;

import javax.persistence.Converter;

import java.net.InetAddress;

import java.net.UnknownHostException;


@Converter

public class InetAddressConverter implements AttributeConverter<InetAddress, String> {

    @Override

    public String convertToDatabaseColumn(InetAddress attribute) {

        if (attribute == null)

            return null;

        else

            return attribute.getHostAddress();

    }


    @Override

    public InetAddress convertToEntityAttribute(String dbData) {

        if (dbData == null || dbData.isEmpty()) return null;

        try {

            return InetAddress.getByName(dbData);

        } catch (UnknownHostException e) {

            throw new RuntimeException(String.format(

                "InetAddressConverter fail to convert %s to InetAddress: %s", dbData, e.getMessage()), 

            e);

        }

    }

}


AttributeConverter의 타입 파라미터에서 첫 번째 타입 파라미터는 자바쪽의 프로퍼티 타입을, 두 번째 타입 파라미터는 DB의 컬럼 타입을 의미한다. 위 코드의 경우 자바 모델에서 사용할 InetAddress 타입 프로퍼티와 DB 테이블에서 사용할 문자열 타입 간의 변환을 처리하는 컨버터를 구현한 것이다.


컨버터를 구현했으면, JPA의 매핑 클래스에서 @Convert 애노테이션을 사용해서 값을 변환대상 프로퍼티에 컨버터를 지정해주면 된다. 


import javax.persistence.Convert;


@Entity

public class IpRange {


    @Column(name = "RANGE_FROM")

    @Convert(converter = InetAddressConverter.class)

    private InetAddress from;



이제 JPA는 InetAddress 타입의 from 프로퍼티 값을 DB에 저장할 때 InetAddressConverter를 이용해서 문자열로 변환한 뒤에 저장한다. 비슷하게 DB에서 값을 읽어올 때 InetAddressConverter를 이용해서 문자열을 InetAddress로 변환해서 from 프로퍼티에 할당한다.

Posted by 최범균 madvirus

댓글을 달아 주세요

  1. 궁금 2015.04.22 18:06 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 가끔 좋은 정보 많이 가져가는 개발자입니다.

    여기다 질문 올려도 되는건지 모르겠지만 JPA에 관련 내용이라서 여기다 적었습니다.
    @elementCollection 설정 시 Collection Table이 만들어지는데 Set타입이기 때문에
    Collection Table은 fk 컬럼을 포함하여 Embeddable 클래스의 모든 속성이 PK가 생성되는
    걸로 알고 있는데 PK가 생성되지 않습니다. embedded 하는 쪽의 PK만 FK로 생성되고
    PK는 만들어지지 않는데 그 이유가 무엇일까요? JPA 2.1에 Hibernate 4.x 를 영속 엔진으로
    테스트를 하고 있습니다. stackoverflow나 eclipse 커뮤니티에 이런 비슷한 질문이 올라와
    있는 것을 본적이 있는데 시원한 답변이 없더군요. 미리 감사드립니다~

    • 최범균 madvirus 2015.04.26 22:42 신고  댓글주소  수정/삭제

      음... 테이블 자동 생성이나 DDL 생성 기능을 말씀하시는 것 같은데, @ElementCollection이나 @Embeddable 등 애노테이션을 설정한 클래스를 같이 올려주시면 같이 테스트 해 보는데 도움이 되지 싶네요.

  2. 궁금 2015.05.04 23:05 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 답변을 이제야 확인했네요. 이 건과 관련해서 stackoverflow에 올린 글의 링크를 적고 갑니다. 제가 받은 답변은 JPA 스펙에서는 원래 그런 PK는 만들지 않는다 였습니다. http://stackoverflow.com/questions/29797352/jpa-with-hibernate-4-x-elementcollection-primary-key