본문 바로가기

일기

2022-12-07

오늘은 이전에 했던 과제 1을 마무리하는 과정에서 빠져먹은 부분이 일부 있어서 그 부분을 정리하면서 동시에 밀려있던 자바 공부를 진행했다...

이 글에 다 적으면 나중에 되돌아볼 때 힘들기 때문에 내가 쓴 글을 링크를 거는식으로 대체 해야겠다.

 

  1. 팀 과제를 통해서 새로운 정보 및 정리한 내용들
  2. 깃허브에 올린 개인 과제 깃허브 링크

 

 

 

개인 과제 1 깃허브

 

GitHub - SHsus1122/boardhomework: spring CURD 과제

spring CURD 과제. Contribute to SHsus1122/boardhomework development by creating an account on GitHub.

github.com

 

 

이전 글에 이어서 추가된 내용이 있으므로 이전글을 보면서 같이 읽자

 

2022-12-06

이번주 스프링 과제가 총 2개가 있었는데, 이 중에서 첫번째 과제만을 완료하고 이후에 어떤것을 할지에 대해서 고민을 하다가 결국 오늘 기술매니저님께 여쭤보고 기존에 생각했던대로 진행하

shsus.tistory.com

 

 

 

 

질문 1

스프링 프레임워크는 어떤 특징 혹은 장점을 가지고 있나요?

 

  1. POJO기반의 구성 (Plain Old Java Object)Java코드를 이용해서 객체를 구성하는 방식 그대로 스프링에서 사용가능한 덕분에 다유롭게 객체지향적 설계가 가능.
  2. DI(의존성 주입)을 통한 객체 관계 구성의존성 주입은 제어의 역전이 일어나는 것을 전제로 스프링 내부의 객체들 간의 관계를 관리할 때 사용.의존성 주입은 특정 개체에 필요한 객체를 외부에서 결정하여 연결시키는 것을 말함.자바에서는 인터페이스를 사용하여 의존적인 관계를 처리함.
  3. AOP(관점지향 프로그래밍)지원스프링 AOP를 통해 반복적인 코드를 줄이고 개발자가 핵심 비즈니스 로직에만 집중할 수 있도록 지원해줌(AOP로 활용할 객체에는 @Aspect 어노테이션을 붙여줘야함)
  4. 편리한 MVC 환경

 

 

 

 

 

 

 

 

질문 2

스프링에서 DI (의존성 주입) 를 사용하는 이유가 무엇인가요?

 

Dependency Injection 를 사용하는 가장 큰 이유는 높은 생산성이다
테스드가 용이하며 코드의 재사용성도 높혀준다 한 클래스가 가진 제어 권한을 container로 이전시켜 유연성과 확장성을 확장시킵니다이 과정에서 IOC가 발생하며 IOC는 DI의 전제가 된다
필요한 인스턴스를 외부에서 생성,선언 하여 필요로하는 연결시켜준다!

 

 

 

 

 

 

 

 

 

질문 3

JPA는 왜 사용하는가?

 

 

 

생산성

가장 핵심이자 중요한 기능이다개발자가 반복해서하는 JDBC를 사용, SQL을 작성 같은 행위를 JPA가 대신 처리해준다개발자는 JPA에게 객체를 전달만 하면 JPA가 해주기 때문에 객체 설계 중심으로 개발 할 수 있게 된다

 

유지보수성

필드 추가나 삭제등 수정에 따른 과정을 JPA가 대신 처리해준다

 

최적화

애플리케이션과 데이터베이스 간의 성능을 최적화 하는 기능을 제공한다

 

패러다임 불일치 해결

상속, 연관관계, 객체 그래프 탐색 등과 같은 패러다임 불일치를 해결해준다

 

Spring Data JPA

JPA 를 편리하게 사용할 수 있도록 지원하는 프로젝트(모듈) 이다.
더 풀어서 말하면 프레임워크의 한 파트로 JPA 를 이용한 구현체를 더 추상화시키고 더 쉽고 간편하게 JPA 를 이용한 프로젝트를 개발할 수 있게 해 주는 Spring 모듈이다.
사용 방법으로는 Repository 라는 인터페스를 제공함으로써 작동한다.

 

 

 

 

 

 

 

 

 

질문 4

인증, 인가를 구분해서 설명해 보세요.

 

인증

서비스에 접근하는 사용자가 올바른 사용자가 맞는지 확인하는 과정이다
보통 사용자가 올바른 사용자이며 인증의 과정이 정상적으로 끝났다면 인가를 진행 합니다

 

인가

권한을 부여하는 행위입니다인증은 사용자가 를 식별하여 이 사용자의 신원을 확인하는 과정이고사용자에 대해 이 사용자가 이 서비스에 대해 엑세스할 수 있는 권한을 부여해주는 과정입니다
인증 → 인가 는 아니며올바르지 않은 사용자에 대해서도 인가가 이루어 질 수도 있습니다
사용자가 이 서비스를 사용할수 있는 자격증명을 확인한 후자격증명이 끝난 사용자에 대해 이 권한부여를 허가할지 거부할지 결정하게 됩니다

 

 

 

 

 

 

 

 

 

 

 

추가 조사

 

생성자 자동생성 어노테이션 3종

 

@NoArgsConstructor

기본 생성자를 생성해준다.

이 경우 초기값 세팅이 필요한 final 변수가 있을 경우 컴파일 에러가 발생함으로 주의한다.

모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.

@NoArgsConstructor
public class Order {
    private String food;
    private int price;
    private String makers;

    /*@NoArgsConstructor 사용하면 아래와 같은 생성자를 자동 생성할 수 있다.
    public Order() {

    }
    */
}

@RequiredArgsConstructor

final 변수, Notnull 표시가 된 변수처럼 필수적인 정보를 세팅하는 생성자를 만들어준다.

아니면 해당 변수를 final로 선언해도 의존성을 주입받을 수 있다.

@RequireArgsConstructor
public class Order {
    @NotNull
    private String food;
    private final int price;
    private String makers;

    /*@RequireArgsConstructor 사용하면 아래와 같은 생성자를 자동 생성할 수 있다.
    public Order(String food, int price) {
        this.food = food;
        this.price = price;
    }
    */
}

@AllArgsConstructor

전체 변수를 생성하는 생성자를 만들어준다.

모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션

 

@NoArgsConstructor
public class Order {
    private String food;
    private int price;
    private String makers;

    /*@NoArgsConstructor 사용하면 아래와 같은 생성자를 자동 생성할 수 있다.
    public Order() {

    }
    */
}

 

 

 

 

 

 

 

 

 

Gradle(Build Tool)이란?

소스 코드로부터 배포 가능한 산출물을 빌드하는 Build Tool 또는 프로젝트 관리 도구의 종류 중 하나.
Gradle은 Ant의 유용성과 Maven의 편리성을 조합해서 만든 Build Tool.
API 제공 및 확장성이 좋음.
빌드의 구조화를 제공하고, Muilti-Project 빌드를 쉽게할 수 있도록 제공함.
Groovy DSL(Domain Specific Language) 기반으로 되어있음.
빌드 스크립트는 기존 XML이 아닌 Groovy 방식으로 작성되어 있음.

 

 

 

 

 

 

 

 

 

 

 

YAML 이란?

YAML Ain’t Markup Language

“사람이 쉽게 읽을 수 있는” 데이터 직렬화 양식 또는 포맷을 의미.

XML, JSON과 같이 가독성을 염두해 두고 설계된 포맷.

Spring에서는 주로 Config 또는 외부 프로퍼티 값 관련 설정 파일을 작성할 때 가독성을 높이기 위해 YAML 양식을 사용함.

 

 

 

 

 

 

 

 

 

 

 

프록시란?

 

엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아님.
JPA는 굳이 필요없는 DB 조회를 줄이면서 성능을 최적화하기위해, 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연 로딩이라 함.
그런데 지연 로딩 기능을 사용하려면 실제 엔티티 객체 대상에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라고 함.

 

즉시로딩과 지연로딩

  • 즉시로딩엔티티를 조회할 때 연관된 엔티티도 함께 조회. 연관된 엔티티를 조인해서 다 긁어와버리는 것.@ManyToOne(fetch = FetchType.EAGER)
  • 지연 로딩연관된 엔티티를 실제 사용할 때 조회한다. 실제로 가짜 객체를 이용하면서, 그때 별도의 쿼리가 나가는 것.@ManyToOne(getch = FetchType.LAZY)

즉시로딩과 지연로딩의 활용

  • 즉시로딩은 처음부터 모든 테이블에 조인을 걸어버리고 별도로 쿼리가 나가는 경우가 생기며 연관관계가 많고 복잡할수록 비용이 기하급수적으로 늘어나기 때문에 정확하게 이해하고 필요한 상황이 아니라면, 가급적으로 모두 지연로딩을 걸어두는게 일반적.
  • 기본값은 아래와 같음
  • @ManyToOne, @OneToOne⠀⠀⠀: 즉시 로딩(FetchType.EAGER
  • @OneToMany, @ManyToMany⠀ : 지연 로딩(FetchType.LAZY)
  • 앞으로 코딩 할 때@ManyToOne(FetchType.Lazy)로 걸기!

 

 

 

 

 

 

 

 

 

영속성 컨텍스트란?

 

엔티티의 상태

 

비영속상태

영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

 

영속

영속성 컨텍스트에서 관리되는 상태

 

준영속

영속성 컨텍스트에 저장되었다가 분리된 상태

 

삭제

실제 DB에서 삭제된 상태

 

기능

  • 영속성 컨텍스트는 내부에 1차 캐시가 존재합니다
  • 영속성 컨텍스트에서 꺼내온 객체는 동일성이 보장된다

엔티티 매니저를 생성할 때 영속성 컨텍스트가 하나 만들어집니다

엔티티 매니저를 통해 영속성 컨텍스트로 접근할 수 있고 관리되게 됩니다

 

flush()

트랜잭션을 커밋하는 순간 영속성 컨텍스트에 저장된 엔티티를 DB에 반영하게 됩니다

 

persist()

사용하여 엔티티 매니저에 생성된 영속성 컨텍스트에 저장된 영속 상태의 엔티티는
영속성 컨텍스트의 내부 1차캐시 에 저장됩니다
  • 1차캐시
    • 영속성 컨텍스트 내부에 1차적으로 저장되는 저장소
    • Map 형태로 저장되며 key는 @Id, value는 엔티티의 인스턴스이다
    • 영속성 컨텍스트에 데이터를 저장하고 조회하는 기준은 DB의 PK 값이다
    • 영속 엔티티의 동일성을 보장한다

clear()

영속성 컨텍스트를 초기화 합니다
초기화 함으로써 영속성 컨텍스트의에 저장된 모든 엔티티를 준영속 상태로 만듭니다

'일기' 카테고리의 다른 글

2022-12-09(연관 관계)  (0) 2022.12.09
2022-12-08  (0) 2022.12.08
2022-12-06  (0) 2022.12.06
2022-12-05  (0) 2022.12.05
2022-12-03  (0) 2022.12.02