Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

하지만 데이터를 객체중심 접근방법을 사용하기위해서는 각종 연관키가 설정된 엔티티를 ,

참조형태의 객체모델로 변환하는 방법을 알아야합니다. 이것은 생각보다 여려우며

외래키를 사용하여 조인을 걸어 연관 객체를 얻어오는것은 여러차례의 SQL문을 통해 성공하고 사용될수 있으나

JPA에서는 테이블에 걸려있는 연관키를 파악하고 머릿속에 정확한 ERD를 그려내지 못하면

참조를 얻는것은 실패할것입니다.


Entity 설계

데이터베이스의 엔티티를 단순하게 맵핑을 하고 사용을 한다고 하면, 연관성 설정은 필요가 없습니다.

하지만 외래키를 통해 이루어지는  연관 속성을 , 객체에도 반영을 하려면 연관성을 설정하는

다음 JPA 어노테이션을 알고 있어야 합니다.

  • ManyToOne : N VS 1 관계
  • OneToMany : 1 VS N 관계
  • ManyToMany : N VS N 관계


ManyToOne

Image Added

Expand
titleDDL

CREATE TABLE `group_info` (
  `group_id` int(11) NOT NULL AUTO_INCREMENT,
  `namevarchar(255) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
 
 
CREATE TABLE `user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `namevarchar(255) COLLATE utf8_bin DEFAULT NULL,
  `group_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  KEY `FKa36i4ekojwk70bxen390i6tek` (`group_id`),
  CONSTRAINT `FKa36i4ekojwk70bxen390i6tek` FOREIGN KEY (`group_id`) REFERENCES `group_info` (`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;



외래키로 설정된 두 테이블의 엔티티입니다. 사용자가 여러명있고 그룹은 여러명의 사용자를

가질수 있기때문에   N : 1 관계 입니다.

선언

클래서 정의 코드내에서는 '@ManyToOne' 어노테이션 설정을통해 연관관계를 설정을 하기만하면됩니다.

데이터베이스와 유사하게 몇가지 제약조건( 널허용 )을 적용 하는것도 가능합니다.

Code Block
languagejava
themeEmacs
@Entity
public class User {
    @Id
    @GeneratedValue
    @Column(name = "USER_ID")
    private Integer id;
 
    private String name;
 
    private String email;
  
    @ManyToOne
    @JoinColumn(name = "GROUP_ID", nullable=true )
    private GroupInfo groupInfo;   
}


사용예

로직순서:

  • 존재하는 그룹을 찾는다.
  • 사용자를 등록하고, 찾은 그룹을 지정한다.
  • 사용자를 찾고, 지정된 그룹을 조회한다.
No Format
GroupInfo someGroup = groupRepository.findByName("학생");


//저장시
User addUser = new User();
addUser.setName("minsu");
addUser.setEmail("test@x.com");
addUser.setGroupInfo(someGroup);


//조회시
User someUser =  userRepository.findByName("minsu")
GroupInfo someUserMyGroup = someUser.getGroupInfo();

객체 지향적으로 접근을 한 예입니다. 데이터 베이스가 가진 정보를 단순하고 직관적이게 접근을 할수 있습니다.

위 로직을, 전통적인 방법으로 어플리케이션내에서  SQL/SP문으로 각각 처리한다라고 가정하면 , JAVA코드내에 SQL문이 썩여서 처리되거나

처리가 된다고 해도 , 사용자의 객체로부터 그룹참조를 얻어내는것은 어려울수 있습니다.