Fullstack-Study-241204-250625

커리큘럼(12-30/변경)

01. Java
02. git
03. Database 
04. Jsp [Server]

05. HTML,CSS 
07. JS
06. 미니프로젝트-2W

08. SpringFramework , SrpingBoot (v)
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)

스프링 부트

JPA(Java Persistence API)

JPQL

JPQL 특징

@Override
public List<Object[]> mtoJoin2(long mno) {
	TypedQuery<Object[]> result = entityManager.createQuery(
			"SELECT m, x FROM Memo m JOIN m.member x where m.mno >= :mno"
			, Object[].class );
	
	result.setParameter("mno", mno);
	List<Object[]> list = result.getResultList();
	return list;
}
@Override
public List<Object[]> mtoJoin3(String name) {
	
	TypedQuery<Object[]> result = entityManager.createQuery(
			"SELECT m, x FROM Memo m JOIN Member x ON m.writer = x.name "
			+ "where x.name = :name"
			, Object[].class);
	
	result.setParameter("name", name);
	
	return result.getResultList();
}
  1. 즉시로딩 타입 (Eager)
  • 조인을 걸고 데이터 조회시 연관된 데이터까지 한번에 불러오게 됨
@ManyToOne(fetch = FetchType.EAGER) //ManyToOne의 기본값 입니다
@JoinColumn(name = "member_id") 
private Member member;
  1. 지연로딩 타입(Lazy)
  • 조인을 걸고 데이터 조회시 필요한 시점에 연관된 데이터를 불러옴
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id") 
private Member member;

could-not-initialize-proxy-no-Session에러

  • JPA에서 Session은 영속성 컨텍스트 의미
  • 지연로딩에서 첫번째 SQL이후 추가적인 SELECT을 실행할 때 영속성 컨텍스트가 없기 떄문에 발생하는 오류
  • 해결방법
    1. @Transactional 어노테이션으로 함수를 묶음
    1. Fetch Join을 활용

JPQL 조인

  1. @OneToMany - 일대다 단방향
  • 연관관계 주인은 FK를 관리
  • OneToMany @JoinColumn은 N테이블의 member_id를 FK로 조인을 의미
  • 원투매니 조인 전략은 default FetchType.Lazy
# Entity 테이블
@OneToMany(fetch = FetchType.EAGER) //원투매니 기본조인방식 - Lazy
@JoinColumn(name = "member_id") //원투매니 조인컬럼 - N테이블의 member_id를 FK로 조인하겠다.
private List<Memo> list = new ArrayList<>();


# JPQL
public Member otmJoin1(String id) {
	
	TypedQuery<Member> result = entityManager.createQuery(
			"SELECT m FROM Member m JOIN m.list x WHERE m.id = :id"
			, Member.class);
	
	result.setParameter("id", id);
	Member m = result.getSingleResult(); //1행을 얻음
	
	return m;
} 
  1. 다대일 양방향 맵핑

사용과 규칙

  • mappedBy는 양방향 관계에서 주인이 아닌 엔터티( 1 )에서 사용
  • mappedBy를 사용하는 측에서는 관계의 세부 사항(매핑 정보)을 정의하지 않음
  • 매핑은 관계의 주인(owning side)에서 정의해야 함
  • 양방향 참조가 들어가므로 toString은 반드시 한쪽에만 정의
# (N)
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;

# (1) toString메서드는 한쪽에서 삭제제
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY) 
private List<Memo> list = new ArrayList<>();