관리 메뉴

CASSIE'S BLOG

103-1강 스프링부트와 JPA v2 본문

PROGRAMMING/슈퍼코딩 강의 정리

103-1강 스프링부트와 JPA v2

ITSCASSIE1107 2024. 4. 8. 12:33

 
 
fetch가 관계에 적용되는 객체를 어떻게 가져올건지에 대해서 정의하는 거라고함. 
 
기본 jqa로 하기 힘들면 jpql를 쓴다고함.
 
spring 3요소중에 하나인 psa에 대해서 설명할 거라고 함.
 
 
스프링(Spring) 프레임워크의 3가지 주요 구성 요소는 다음과 같습니다: PSA (Portable Service Abstraction), DI (Dependency Injection), AOP (Aspect-Oriented Programming) 입니다.

  1. Portable Service Abstraction (PSA):
    • 설명: PSA는 스프링의 핵심 철학 중 하나입니다. 이것은 다양한 서비스 제공자 및 서비스 소비자 간에 효과적으로 상호 작용할 수 있도록 추상화를 제공합니다. PSA의 핵심 아이디어는 특정 기술 스택에 종속되지 않고 애플리케이션 코드를 작성할 수 있도록 하는 것입니다. 예를 들어, 스프링의 JDBC(Java Database Connectivity) 모듈은 JPA(Java Persistence API)나 Hibernate와 같은 ORM(Object-Relational Mapping) 기술을 사용하여 데이터베이스와 상호 작용할 수 있도록 표준화된 방법을 제공합니다. 이것은 애플리케이션이 데이터베이스 기술을 변경하거나 업그레이드할 때 코드를 다시 작성하지 않아도 되게 합니다.
  2. Dependency Injection (DI):
    • 설명: DI는 객체 간의 의존성을 외부에서 주입하여 결합도를 줄이고 코드의 유연성과 유지 보수성을 향상시키는 디자인 패턴입니다. 스프링은 DI를 통해 객체 간의 의존성을 관리하고 제어합니다. 이는 객체가 직접 자신이 필요로 하는 의존 객체를 생성하거나 관리하지 않고 외부에서 주입되는 방식으로 작동합니다. 이를 통해 테스트 용이성과 코드 재사용성이 증가하며, 코드 간의 결합도가 낮아져 시스템을 확장하고 유지 관리하기가 더 쉬워집니다.
  3. Aspect-Oriented Programming (AOP):
    • 설명: AOP는 횡단 관심사(cross-cutting concerns)를 모듈화하여 코드의 재사용성과 유지 관리성을 향상시키는 프로그래밍 패러다임입니다. 이는 핵심 비즈니스 로직과는 별개로 흩어진 로깅, 트랜잭션 관리, 보안 등의 관심사를 횡단(cross-cutting)하게 처리할 수 있도록 합니다. 스프링 AOP는 프록시 패턴을 기반으로하여 메소드 호출 전후 또는 예외 발생 시에 추가적인 기능을 삽입하는 방식으로 작동합니다. 이는 코드의 중복을 제거하고 유지 보수성을 높이는 데 도움이 됩니다.

 
참조 자료: 
https://blogshine.tistory.com/480

[Spring] 스프링의 3대 요소 (IoC/DI, PSA, AOP)

Spring의 핵심적인 요소 3가지가 있다. 이에 대하여 잘 알고 있다 생각했는데, 막상 대답해주려니 생각보다 나의 생각을 전달하기가 어려웠다. 이번 기회에 3대 요소에 대하여 간단하게나마 정리

blogshine.tistory.com

 
Spring에서 Servlet기반의 Application을 만들고 있음에도 불구하고, Servlet 코드는 전혀 보이지 않는다.
단순하게 Controller만 봐도 @GetMapping, @PostMapping등의 에노테이션을 통해 편하게 코드를 작성한다.

 
PA(Java Persistence API)에서의 관계 다중성은 엔티티(객체) 간의 관계를 표현하는 방식을 의미합니다. 주로 "One-to-One", "One-to-Many", "Many-to-One", "Many-to-Many"의 네 가지 유형이 있습니다.

One-to-One (일대일):

이 관계는 한 엔티티가 다른 엔티티와 하나의 관계만 가지는 것을 의미합니다. 예를 들어, 한 사람은 하나의 주민등록증을 가질 수 있고, 한 주민등록증은 한 사람에게만 속할 수 있습니다.

One-to-Many (일대다):

이 관계는 한 엔티티가 다른 엔티티와 여러 개의 관계를 가지는 것을 의미합니다. 예를 들어, 한 부서는 여러 명의 직원을 가질 수 있지만, 각 직원은 하나의 부서에만 속할 수 있습니다.

Many-to-One (다대일):

이 관계는 다수의 엔티티가 하나의 다른 엔티티와 관계를 가지는 것을 의미합니다. 예를 들어, 여러 명의 학생이 하나의 강사에게 속할 수 있지만, 각 학생은 한 명의 강사에게만 속할 수 있습니다.

Many-to-Many (다대다):

이 관계는 다수의 엔티티가 다수의 다른 엔티티와 관계를 가지는 것을 의미합니다. 예를 들어, 여러 명의 학생이 여러 개의 과목을 수강할 수 있고, 각 과목은 여러 명의 학생을 가질 수 있습니다.
이러한 관계 다중성은 데이터베이스에서의 관계를 객체 간의 관계로 매핑할 때 중요한 개념입니다. JPA를 사용하면 이러한 다양한 관계를 간단하게 매핑하고 사용할 수 있으며, 객체지향적인 관점에서 데이터를 다룰 수 있습니다. 예를 들어, 객체지향적인 관점에서 부서와 직원의 관계를 매핑하고 사용할 때, 부서 객체 내부에 직원 목록을 가지고 있을 수 있습니다.
 
 

멤버 입장에서는 팀이라는 이 객체는 many to one으로 가는 거잖아. 
 

 
foreign key에 매핑이 되야하는거야
보면 member에 핑크색 줄에 team_id가 있잖아 member 클래스에 그거를 적어줘서 매핑해줘야함. 
 

 
팀의 입장에서 멤버를 바라볼 수도 있겠죠. 한팀에 여러명의 멤버들을 가질 수 있으니까. 그대로 구현을 하면 되는거임. 팀입장에서는 One이고 멤버는 many니까  
근데 member가 foreign key갖고 있으니까 일단 조인컬럼은 foreign key의 이름으로 가야한다고함. 
member 다수 가지니까 List 가지면 되는거고. 
 

이전에도 말씀드렸다시피, 다대다는 바로 테이블을 연결하지 않는다. 
보통 연결테이블을 만드는게 일반적이다. 
멤버프로덕트(연결테이블) 멤버프로덕트가 다, member가 일, 그리고 product가 일 이런식으로 처리하는 게 일반적임. 
 
이제 방향에 대해서 말해본다함.
 

 
이건 멤버가 팀을 바라노는 단방향 관계다. 하고 그래서 파란색 상자 표시해놓은 거임. 
 
 

서로 필드 가지는 거 양방향
 
JoinColumn이 근데 두개가 있으면 안된다고함.
 
테이블입장에서는 fk키가 하나인거는 그대로이기 때문이란다. 
 
한쪽이 조인컬럼을 가지고있고다른한쪽은 원투매니 이런식으로만 적용하고 Mapped By로 정의해야한다.
 

 
JOINCOLUMN를 이 객체가 이 연관관계의 주인이라고함,
 
양방향관계설정할때는 둘중에 누가 주인인지를 설정을 해야한다고함. 
 

 
실습 X 시간 없어서 미룸.
 
18분 실습에서 ~~ 
 
실무에서 쓸 수 있는 팁인데 getter를 따로 하나 정의를 하고
ItemEntity에서 getStoreSales()

public Optional<StoreSales> getStoreSales(){
return Optional.ofNullable(storeSales);
}

**
Optional.ofNullable() 메서드는 주어진 값이 null이 아니면 해당 값을 감싸는 Optional 객체를 반환하고, 값이 null이면 비어있는 Optional 객체를 반환합니다.
 


자바에서 get메소드 쓸 필요없고 lazy쓰면 된다는데 그게 무슨 말이야

"get 메소드를 사용하지 않고 lazy를 사용한다"는 것은 일반적으로 객체의 속성을 처음에 초기화하지 않고, 해당 속성이 필요한 시점에 초기화하는 것을 말합니다. 이렇게 하면 객체의 속성을 필요할 때만 초기화하여 메모리를 절약할 수 있습니다. 자바에서는 보통 이를 "lazy initialization(지연 초기화)"라고 합니다. 이 방법을 사용하면 get 메소드를 따로 작성할 필요가 없습니다.

FetchType.LAZY: 연관된 엔티티를 실제로 사용할 때까지 가져오지 않고, 실제로 사용할 때 가져옵니다. 이렇게 하면 필요하지 않은 연관된 엔티티를 가져오지 않아 성능이 향상됩니다.

FetchType.EAGER: 연관된 엔티티를 항상 즉시 가져옵니다.

즉, fetch = FetchType.LAZY는 해당 관계를 지연 로딩한다는 의미입니다.




 

반응형