[WIL] 항해99 3주차

woonie·2022년 1월 29일
0

WIL

목록 보기
3/12
post-thumbnail

항해 3주차 마무리

1. Spring 기본

  • @Controller, @Service, @Repository, @Component 의 어노테이션이 붙어있는 클래스는 컴포넌트 스캔을 통해 스프링이 스프링 컨테이너에 스프링 빈으로 자동등록해서 쓸 수 있게 만든다.
  • DB의 테이블은 JPA의 @Entity라는 어노테이션을 통해 지정된다.
  • 엔티티의 Column들은 private으로 설정하고 Getter로만 값에 접근할 수 있도록 한다. DB 테이블의 값을 막 바꿀 수 없게 하기 위함이다.
  • controller, Service, Repository에서 DB의 데이터가 이동할 때 Entity를 직접적으로 사용하면 안되므로 DTO를 만들어줘야한다.
  • @RestController 란 @Controller 와 @ResponseBody 가 합쳐진 어노테이션으로 문자열과 JSON 등을 반환할 수 있다.
  • @RequiredArgsConstructor -> final로 선언된 멤버 변수를 자동으로 생성한다. 즉 생성자 주입을 해주는 어노테이션.
  • @NoArgsConstructor -> 기본 생성자를 만들어주는 어노테이션
    클라이언트에서 data와 함께 ajax 요청을 보낼 때
    data: JSON.stringify(itemDto) 를 통해 JSON을 문자열 형태로 변환해주고 (자바에서는 JSON을 그대로 처리하지 못함(?) -> 문자열 형태로 받아 자바 객체 형태로 만들어서 처리)
    스프링에 json 형식의 데이터를 준다는 것을 명시하기 위해 (즉, 문자열 형태의 데이터를 주지만 JSON 형식이라고 알려줌)
    contentType: "application/json" 을 반드시 추가해야한다.
  • JPA의 update는 @Transactional이 선언된 update 메소드 안에서 DB의 데이터의 변경을 감지하고 테이블에 알려줌으로서 동작함.
  • JPA의 save나 findby 등은 자동으로 변경감지가 됨 (@Transactional 이 따로 필요 없지만 필요에 따라 쓸 수는 있음)

2. DI

Dependency Injection "의존성 주입"

class Programmer {
    private Coffee coffee;

    public Programmer() {
    	this.coffee = new Coffee();
    }
    
    public startProgramming() {
    	this.coffee.drink(); // 일단 마시고 시작하자
        ...
    }
}

위 코드와 같이 Programmer 클래스에서 startProgramming 함수가 호출되기 위해서는 Coffee 클래스를 필요로 한다. 이것을 Programmer 클래스는 Coffee 클래스의 의존성을 가진다 라고 한다.

이와 같이 코드를 설계하였을 때, 코드의 재활용성이 떨어지고, 위 예제에서 Coffee 클래스가 수정 되었을 때, Programmer 클래스도 함께 수정해줘야하는 문제가 발생한다.

즉, 결합도(coupling)가 높아지게 된다.

2-1. DI(의존성 주입)를 해야 하는 이유

  • DI로 프로그램을 설계 했을 때, 다음과 같은 이점을 얻을 수 있다.
    • Unit Test가 용이해진다.
    • 코드의 재활용성을 높여준다.
    • 객체 간의 의존성(종속성)을 줄이거나 없엘 수 있다.
    • 객체 간의 결합도이 낮추면서 유연한 코드를 작성할 수 있다.

만약 DI를 사용하지 않고 Coffee 클래스의 상속을 받은 Cappuccino나 Americano 클래스를 사용해야 한다면 다음과 같이 직접 수정해 줘야 한다.

class Coffee {...} 

// Coffee 클래스를 상속
class Cappuccino extends Coffee {...}
class Americano extends Coffee {...}

// Programmer.java
class Programmer {
    private Coffee coffee;

    public Programmer() {
    	this.coffee = new Cappuccino(); // 직접 수정
        // 또는 
        this.coffee = new Americano(); // 직접 수정
    }
    
    ...
}

3. IoC

"제어의 역전 (IoC: Inversion of Control)"
프로그램의 제어 흐름이 뒤바뀜

  • 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.
    IoC는 제어의 역전이라고 말하며, 간단히 말해 "제어의 흐름을 바꾼다"라고 한다.
    객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.

  • 스프링에서는 다음과 같은 순서로 객체가 만들어지고 실행된다.

    • 객체 생성

    • 의존성 객체 주입
      스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입 한다.

    • 의존성 객체 메소드 호출
      스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한곳에 주입시켜줌으로써 Bean들은 싱글턴 패턴의 특징을 가지며,

제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.

4. Bean

Spring IoC 컨테이너가 관리하는 자바 객체

Bean은 Spring IoC Container가 관리하는 자바 객체, Spring Bean Container에 존재하는 객체를 말한다.
Spring IoC(Inversion of Control) Contatiner에 의해 인스턴스화, 관리, 생성된다.
Bean Container는 의존성 주입을 통해 Bean 객체를 사용할 수 있도록 해준다.
Spring에서 Bean은 보통 Singleton으로 존재한다.

profile
동료들과 함께하는 개발의 중요성에 관심이 많습니다. 언제나 호기심을 갖고 꾸준히 노력하는 개발자로서 성장하고 있습니다.

0개의 댓글