연관관계 (단방향과 양방향)
연관관계 매핑
- 방향 : 단방향, 양방향
- 다중성 : 일대일, 일대다, 다대일, 다대다
- 연관관계 주인 : 객체 양방향 연관관계는 주인이 필요함!
1. 일대일 단방향
1. Entity
1. Host - 주 테이블
package com.example.demo.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@NoArgsConstructor
@Data
public class Host1 {
// 1:1 단방향
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "target_id")
private Target1 target;
@Builder
public Host1(String name, Target1 target) {
this.name = name;
this.target = target;
}
}
2. Target
package com.example.demo.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@NoArgsConstructor
@Data
public class Target1 {
// 1:1 단방향
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Builder
public Target1(String name) {
this.name = name;
}
}
3. Host1Repository
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.domain.Host1;
@Repository
public interface Host1Repository extends JpaRepository<Host1, Long> {
}
4. TargetRepository
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.domain.Target1;
@Repository
public interface Target1Repository extends JpaRepository<Target1, Long> {
}
5. HostTargetService
package com.example.demo.service;
import org.springframework.stereotype.Service;
import com.example.demo.domain.Host1;
import com.example.demo.domain.Target1;
import com.example.demo.repository.Host1Repository;
import com.example.demo.repository.Target1Repository;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class HostTargetService1 {
private final Target1Repository targetRepo;
private final Host1Repository hostRepo;
public void save() {
Target1 target = Target1.builder().name("target1").build();
Host1 host = Host1.builder().name("host1").target(target).build();
targetRepo.save(target);
hostRepo.save(host);
}
public Target1 read1() {
return targetRepo.findById(1L).get();
}
public Host1 read2() {
return hostRepo.findById(1L).get();
}
}
6. HostTargetController
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.domain.Host1;
import com.example.demo.domain.Host2;
import com.example.demo.domain.Target1;
import com.example.demo.domain.Target2;
import com.example.demo.service.HostTargetService1;
import com.example.demo.service.HostTargetService2;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
@Api
@RestController
@RequestMapping("/host-target")
@RequiredArgsConstructor
public class HostTargetController {
private final HostTargetService1 hostTargetService1;
private final HostTargetService2 hostTargetService2;
@PostMapping("/save1")
public void save1() {
hostTargetService1.save();
}
@GetMapping("/read-host1")
public Host1 readparent1() {
return hostTargetService1.read2();
}
@GetMapping("/read-target1")
public Target1 readchild1() {
return hostTargetService1.read1();
}
}
7. Swagger & DB 확인하기
1. save1 실행

save1 실행하면 test 계정에 host1 과 target1 테이블이 만들어지며, 데이터 insert를 확인할 수 있다.
Eclipse 콘솔창 log에 찍힌 Insert query도 확인해보자.

2. DBeaver 확인하기 (Data Insert 와 ERD)

1) host1 과 target1 테이블 & 데이터 확인
2) ERD 확인
target1 테이블의 PK인 id가 host1 테이블의 FK로 설정된것 확인.
3. read-host1 조회

log에 찍힌 Select query 확인하면 아래와 같다.

Join된 query 확인이 가능하다.
4. read-target1 조회
