본문 바로가기
카테고리 없음

230210 TIL

by hbIncoding 2023. 2. 11.

Spring  심화 주차 1일차

1. JPA 심화

 1)영속성 컨텍스트(Persistence Context)

  • 엔티티를 영구 저장하는 환경
  • 어플리케이션이 데이터베이스에서 꺼내온 데이터 객체를 보관하는 역할
  • 엔티티 매니저를 통해 엔티티를 조회하거나 저장할 때 엔티티를 보관하고 관리 한다.
  • JPA엔티티의 상태
    • 비영속(New) : 영속성 컨택스트와 관계없는 새로운 상태, 실제 DB와 관련없고 Java객체인 상태
    • 영속(Managed) : 엔티티 매니저를 통해 엔티티가 영속성 컨텍스트에 저장되어 관리되고 있는 상태, 이와 같은 경우 데이터의 생성,변경등을 JPA가 추적하면서 필요하면 DB에 반영한다.
    • 준영속(Detached) : 영속성 컨텍스트에서 관리되다가 분리된 상태
    • 삭제(Removed) : 영속성 컨텍스트에서 삭제된 상태

  2) 영속성 컨텍스트의 설계

   ㄱ. 1차 캐시

  • 서버가 떠있는 컴퓨터에 DB를 함께 두면 부하가 심하기에 따로 두어야 한다.
  • 아플리케이션에서 데이터 조회가 아주 잦은데 그럴때마다 DB로 SQL쿼리 내는 일을 막아야한다
  • 그래서 영속성 컨텍스트 내부에 1차 캐시를 둔다.
    • find("memberB")와 같은 로직이 있을 때 먼저 1차 캐시를 조회
    • 있으면 해당 데이터를 반환
    • 없으면 그 때 실제 DB로 쿼리문을 보낸다.
    • 그리고 반환하기 전에 1차 캐시에 저장하고 반환.

  ㄴ. 쓰기 지연 SQL 저장소

  • 1차 캐시와 비슷한 맥락으로 MemberA, B를 생성할 때마다 DB를 다녀오는건 비효율적이기에 저장소를 두었다
    • MemberA, MemberB를 영속화 하고
    • entityManager.commit() 메서드를 호출하면
    • 내부적으로 쓰기 지연 SQL 저장소에서 Flush가 일어나고
    • "INSERT A", "INSERT B"와 같은 쓰지 전용 쿼리들이 DB로 흘러들어간다.

   ㄷ. DirtyChecking을 통해 데이터의 변경을 감지해서 자동으로 수정

  • 1차 캐시에는 DB의 엔티티 정보만 저장하는 것이 아니다
  • 해당 엔티티를 조회한 시점의 데이터 정보를 같이 저장
  • 그리고 엔티티객체와 조회 시점의 데이터가 다르다면 변경 발생을 인지 > 변경 부문을 UPDATE쿼리 작성

  ㄹ. 데이터의 어플리케이션 단의 동일성을 보장

  • java 컬렉션에서 값을 가져 올때 동일한 주소 값을 가져오듯이, 같은 reference를 불러오면 동일성을 보장해줍니다.
  • 1차 캐시가 있기 때문에 가능
  • 1차 캐시로 반복 가능한 읽기(REPATABLE READ) 등급의 트랜잭션 격리 수준을 DB가 아닌 어플리케이션 차원에서 제공 ( == 비교 시 true)

 

 

2. 엔티티 매핑 심화

 1)연관관계 관련 심화

  • 방향 : 단방향과 양방향 존재
  • 다중성 :다대일,일대다,일대일,다대다 존재
  • 연관관계의 주인 : 양방향일 때 연관 관계에서 관리 주체

  ㄱ. 단방향, 양방향

  • DB 테이블은 외래 키 하나로 양 쪽 테이블 조인 가능
  • 그러나 객체는 참조용 필드가 있는 객체만 다른 객체를 참조 가능
  • 그래서 두 객체 중 하나만 참조용 필드를 가지고 참조하면 단방향 관계, 두 객체 모두 면 양방향 관계
  • 엄밀히 말하면 양방향 관계라기 보다는 두 객체가 단방향 참조를 각각 가져서 양방향 관계처럼 사용하는 것
    • Board.getPost()처럼 참조가 필요하면 Board→Post 단방향참조
      • 만약 참조가 굳이 필요없으면 참조를 안하면 됨
    • post.getBoard()처럼 참조가 필요하면 Post→Board 단방향참조
      • 만약 참조가 굳이 필요없으면 참조를 안하면 됨
  • 이렇게 비즈니스 로직에 맞게 선택했는데 두 객체가 서로 단방향 참조를 했다면 양방향 연관 관계가 되는 것

  ㄴ. 양방향 관계를 하면 쉽지 않나?

  • 객체 입장에서는 양방향 매핑 시 오히려 복잡해 질 수 있다.
  • 예를 들어 User(사용자)엔티티는 많은 엔티티와 관계를 맺는데 이러면 User 클래스가 엄청나게 복잡해 진다.
  • 기본적으로 단방향 매핑을 하고 나중에 역방향으로 객체 탑색이 꼭필요할 때 추가하는 것이 좋다.

  ㄷ. 연관 관계의 주인

  • 제어의 권한(외래 키를 비롯한 테이블 레코드를 저장, 수정, 삭제 처리)을 갖는 실질적인 관계가 어떤 것인지 JPA에게 알려준다고 생각하면 됩니다.
  • 연관 관계의 주인은 연관 관계를 갖는 두 객체 사이에서 조회, 저장, 수정, 삭제를 할 수 있지만, 연관 관계의 주인이 아니면 조회만 가능합니다.
  • 연관 관계의 주인이 아닌 객체에서 mappedBy 속성을 사용해서 주인을 지정해줘야합니다.
  • TIP : 외래 키가 있는 곳을 연관 관계의 주인으로 정하면 됩니다.
  • DB만 생각했을 때 DB에 FK가 있는 테이블을 수정하려면 주인쪽만 변경하면 된다.
  • 하지만 객체를 생각하면 둘다 변경하는 것이 좋다. 두 참조를 사용하는 순수한 두 객체는 데이터 동기화를 해줘야하기 때문입니다.

3. 프록시(Proxy)

 1)프록시 개념

  • JPA는 굳이 필요없는 DB 조회를 줄이면서 성능을 최적화한다고 말씀드렸죠? 이런 문제를 해결하려고 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연 로딩이라 합니다. 그런데 지연 로딩 기능을 사용하려면 실제 엔티티 객체 대상에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라고 합니다.

  ㄱ.즉시 로딩과 지연 로등

  • 즉시 로딩 : 엔티티를 조회할 때 연관된 엔티티도 함께 조회 @ManyToOne(fetch = FetchType.EAGER)
  • 지연 로딩 : 연관된 엔티티를 실제 사용할 때 조회 @ManyToOne(fetch = FetchType.LAZY)
  • 그래서 두 객체 중 하나만 참조용 필드를 가지고 참조하면 단방향 관계, 두 객체 모두 면 양방향 관계
  • 엄밀히 말하면 양방향 관계라기 보다는 두 객체가 단방향 참조를 각각 가져서 양방향 관계처럼 사용하는 것

  ㄴ. 영속성 전이

  • 특정 엔티티를 영속성 상태로 만들어 연관되어진 엔티티도 함께 영속성 상태로 변경하는 것
  • Cascade 라는 옵션을 통해 사용하며 수행.
  • 옵션과 정보
   
옵션 정보
CascadeType.ALL 모두 적용
CascadeType.PERSIST 영속
CascadeType.MERGE 병합
CascadeType.REMOVE 삭제
CascadeType.REFRESH REFRESH
CascadeType.DETACH DETACH

 

4. AllInOneCode, DI

 1)AllInOneController 코드의 한계점

  • 한개의 클래스에 너무 많은 양의 코드 존재 : 코드 이해가 어려움
  • 현업에서는 코드 추가 혹은 변경 요청이 계속 생김

 2)DI(Dependency Injection) 의존성 주입

  • A가 B에 의존한다는 것은 B가 변하면 그것이 A에 영향을 미친다고 할 수 있다.
  • 의존관계를 인터페이스로 추상화하면, 더 다양한 의존관계를 맺을 수 있고, 실제 구현 클래스와 관계가 느슨해지고 결합도가 낮아진다.
  • 즉 DI는 의존관계를 외부에서 결정하고 주입하여 주는 것이다.

 ㄱ. 강한 결합과 약한 결합

public class Person {
    private Chicken chicken;
    
    public Person() {
        this.chicken = new Chicken();
    }

    public void startEat() {
        chicken.eat();
    }
}

public class Chicken {
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}
  • 위 코드에서 문제가 없어 보이지만 치명적인 단점이 있다.
    • 1. Chicken 클래스가 없으면 Person 클래스를 정의 할 수 없다.
    • 2 Chicken 클래스를 다른 종류의 음식으로 바꾸게 되면 Person 클래스의 코드 대부분이 변경된다.
  • 즉 Person 클래스가 Chicken 클래스에 의존하고 있다는 것이다. => 강한 결합을 이루고 있다.
  • 이러한 문제를 해결하기 위해 약한 결합을 이루게 하고 그 해결책으로 인터페이스가 있다.
    • 인터페이스로 클래스를 나누어 준다면 하나가 변해도 다른 클래스의 내부적으로 코드 변경이 일어날 필요 없이, 생성자를 통해 객체를 받아 멤버변수에 대입하기만 하면 오브젝트를 변경 가능하게 해준다.
  • 정리
    • 객체 간 강한 결합을 이루게 되면 멤버 변수에 대한 오브젝트 변경시 코드의 변경이 많이 일어나 유지보수에 좋지 않다.
    • 인터페이스를 통해 약한 결합을 이루게 하여 유지보수를 향상시킨다.

 ㄴ. DI 구현 

  • DI는 의존관계를 외부에서 결정하는 것이기에, 클래스 변수를 결정하는 방법들이 곧 DI를 구현하는 방법이다.
  • 런타임 시점의 의존관계를 외부에서 주입하여 DI구현이 완성된다.
  • DI장점
    • 의존성이 줄어든다
    • 재사용성이 높은 코드가 된다
    • 테스트하기 좋은 코드가 된다
    • 가독성이 높아진다.

5. 스프링 프레임워크

 1)스프링 프레임워크란?

  • 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션
  • Spirng Framework는 경량 컨테이너로 자바 객체를 담고 직접 관리합니다. 객체의 생성 및 소멸 그리고 라이프 사이클을관리하며 언제든 Spring 컨테이너로 부터 필요한 객체를 가져와 사용할 수 있습니다.

 2)Spring Framwork는 IOC 기반이다. IOC란?

  • IOC는 Inversion of Control의 약자로 말그대로 제어의 역전이다.
  • 일반적으로는 아래와 같이 모든 작업을 사용자가 제어하는 구조이다.
    • 객체 결정 및 생성 -> 의존성 객체 생성 -> 객체 내의 메소드 호출 하는 작업을 반복
  • 하지만 IOC는 이 흐름을 바꾸어 제어의 흐름을 사용자가 컨트롤 하지 않고 위임한 특별한 객체에 모든 것을 맡기는 것
  • 즉, IOC란 기존 사용자가 모든 작업을 제어하던 것을 특별한 객체에 모든 것을 위임하여 객체의 생성부터 생명주기 등 모든 객체에 대한 제어권이 넘어 간 것을 IOC, 제어의 역전 

 3)Spring Framwork의 특징 POJO, 평점한 자바 오브젝트

  • POJO(Plain Old Java Object)는 이전 EJB(Enterpise JavaBeans)는 한가지 기능을 위해 불필요한 복잡한 로직이 과도하게 들어간 단점에 비해 getter/setter를 가진 단순 바자 오브젝트로 정의하고 있다.
  • 따라서 의존성이 없고 추후 테스트 및 유지보수가 편리한 유연성의 장점을 가진다.
  • 이로 인해 객체지향적인 다양한 설계와 구현이 가능해졌다.

 4)Spring Framwork의 특징 AOP

  • AOP(Aspect Oriented Programming) : 관점 지향 프로그래밍
  • 대부분 소프트웨어 개발 프로세스는 OOP(Object Oriented Programming, 객체 지향 프로그래밍)이다.
  • OOP는 객체지향 원칙에 따라 관심사가 같은 데이터를 한곳에 모아 분리하고 낮은 결합도를 갖게 하여 독립적이고 유연한 모듈로 캡슐화를 하는 것을 일컫는다.
  • 하지만 이러한 과정 중 중복된 코드가 많아지고, 가독성, 확장성, 유지보수성을 떨어 뜨린다. 
  • 이를 보완하기 위해 AOP가 나왔다.
  • AOP는 핵심기능과 공통기능을 분리시켜 핵심 로직에 영향을 끼치지 않게 공통 기능을 끼워 넣는 개발 형태이다.
  • 즉, 무분별하게 중복되는 코드를 한 곳에 모아 중복 되는 코드를 제거 할 수 있어지고 공통기능을 한 곳에 보관함으로써 공통 기능 하나의 수정으로 모든 핵심기능들의 공통기능을 수정 할 수 있어 효율적인 유지보수가 가능하며 재활용성이 극대화가 된다.

 5)Spring Framwork의 구조

  • Spring Core : Spring Core는 Spring Container을 의미합니다. core라는 말 그대로 Container는 Spring Framework의 핵심이며 그중 핵심은 Bean Factory Container입니다.  그 이유는 바로 Bean Factory는 IOC패턴을 적용하여 객체 구성 부터 의존성 처리까지 모든 일을 처리하는 역할을 하고 있기 때문입니다.
  • Spring Context : Spring context는 Spring Framework의 context 정보들을 제공하는 설정 파일입니다. Spring Context에는 JNDI, EJB, Validation, Scheduiling, Internaliztaion 등 엔터프라이즈 서비스들을 포함하고 있습니다.
  • Spring AOP : Spring Framework에서 관점지향 프로그래밍을 할 수 있고 AOP를 적용 할수 있게 도와주는 Module입니다. 해당 AOP에 대한 내용은 위에서 설명 했기 때문에 넘어 가도록 하겠습니다.
  • Spring DAO : Data Access Object의 약자로 Database Data에 접근하는 객체입니다. Spring JDBC DAO는 추상 레이어를 지원함으로써 코딩이나 예외처리 하는 부분을 간편화 시켜 일관된 방법으로 코드를 짤 수 있게 도와줍니다.
  • Spring ORM : Object relational mapping의 약자로 간단하게 객체와의 관계 설정을 하는 것입니다. Spring에서는 Ibatis, Hibernate, JDO 등 인기있는 객체 관계형 도구(OR도구)를 사용 할 수 있도록 지원합니다.
  • Spring Web : Spirng에서 Web context module은 Application module에 내장되어 있고 Web기반의 응용프로그램에 대한 Context를 제공하여 일반적인 Web Application 개발에 필요한 기본적인 기능을 지원합니다.그로인해 Jakarta Structs 와의 통합을 지원하고 있습니다.
  • Spring MVC : Spring에서는 MVC에서는 Model2 구조로 Apllication을 만들 수 있도록 지원합니다. MVC (Model-View-Controller) 프레임 워크는 웹 응용 프로그램을 작성하기위한 완전한 기능을 갖춘 MVC를 구현합니다. MVC 프레임 워크는 전략 인터페이스를 통해 고급 구성 가능하며 JSP, Velocity, Tiles, iText 및 POI를 포함한 수많은 뷰 기술을 지원하고 있습니다.

 

 

5. 참조 자료

 1) 연관 관계 : https://jeong-pro.tistory.com/231

 

JPA 연관 관계 한방에 정리 (단방향/양방향, 연관 관계의 주인, 일대일, 다대일, 일대다, 다대다)

JPA에서 가장 중요한 것 JPA에서 가장 중요한 것을 뽑자면, "객체와 관계형 데이터베이스 테이블이 어떻게 매핑되는지를 이해하는 것"이라고 생각합니다. 🏅 왜냐하면 JPA의 목적인 "객체 지향 프

jeong-pro.tistory.com

 2)영속성 전이 : https://parkhyeokjin.github.io/jpa/2019/11/06/JPA-chap8.html

 

JPA 영속성 전이 (CASCADE) 와 고아 객체(ORPHAN)

영속성 전이 (CASCADE) 란 특정 엔티티를 영속성 상태로 만들때 연관되어진 엔티티도 함께 영속성 상태로 변경 하는 것을 말합니다. 아래 예를 살펴 보겠습니다. 예에서 보면 3번의 영속성 상태 변

parkhyeokjin.github.io

 3)강한결합,약한결합 : https://velog.io/@damiano1027/Java-%EA%B0%95%ED%95%9C-%EA%B2%B0%ED%95%A9%EA%B3%BC-%EC%95%BD%ED%95%9C-%EA%B2%B0%ED%95%A9

 

[Java] 강한 결합과 약한 결합

객체의 의존 관계에서 강한 결합이란, 어떠한 객체가 다른 객체에 강한 의존성을 가지고 있음을 뜻한다.그렇다면 의존성을 가지고 있다는 것이 무엇인가?의존성이 강하다는 것은 무엇인가?에

velog.io

 4)의존관계 주입 : https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/

 

의존관계 주입(Dependency Injection) 쉽게 이해하기

이번 글에서는 DI(의존성 주입, 의존관계 주입)의 개념을 설명한다.

tecoble.techcourse.co.kr

 5)스프링 프레임워크 :https://khj93.tistory.com/entry/Spring-Spring-Framework%EB%9E%80-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC

 

[Spring] Spring Framework란? 기본 개념 핵심 정리

Spring Framework란? 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션입니다. 엔터프

khj93.tistory.com