본문 바로가기
Back-end/멋쟁이사자처럼

[멋쟁이사자처럼] 키워드 정리 과제

by 잔디🌿 2024. 3. 27.

    이번 과제는 주어진 주제에 대해 공부해보는 것이다.

     

    시작!

     

    DI

     

    DI Dependency Injection 줄임말로 의존관계 주입이라고도 한다.

     

    의존관계란?

     

    "A가 B를 의존한다" 의 뜻은 B가 변경된다면 A도 변경된다는 의미이다

     

    의존관계가 발생하는 상황은 다음과 같다.

     

    -B가 A의 필드

    -B가 A 메서드의 파라미터

    -B가 A의 로컬변수

    -B로 메세지를 보냄

     

    public class Barista {
    	private IceVanillaLatteRecipe iceVanillaLatteRecipe;
    	
    	public Barista() {
            iceVanillaLatteRecipe = new IceVanillaLatteRecipe();        
        }
    }

     

    위 코드와 비교해봤을 때

     

    public class Application {
    
    	public static void main(String [] args) {
            CoffeeRecipe recipe = new IceVanillaLatteRecipe();
            Barista b = new Barista(recipe);  //DI, 의존관계 주입
    
            // ...
        }
    }

     

    이 코드에서는 외부에서 객체를 만들어서 이를 의존하는 클래스에 해당 구현객체를 연결해준다는 것을 알 수 있다.

    위 과정을 의존관계 주입이라고 한다.

     

    토비의 스프링에서는 다음 세 가지 조건을 충족하는 작업을 의존관계 주입이라고 설명한다.

    • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스만 의존하고 있어야 한다.
    • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
    • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

    Bean과 Configuration

    Bean은 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 스프링 컨테이너에 등록된 객체를 스프링빈이라고 한다.

     

    Bean을 사용하는 이유는 스프링 간 객체가 의존관계를 관리하도록 하는 것이다. 객체가 의존관계를 등록할 때 스프링 컨테이너에서 해당하는 빈을 찾고, 그 빈과 의존성을 만든다.

     

    Bean을 등록하는 방법

     

    수동으로 등록하기

    @Bean을 사용한다.

     

    빈을 수동으로 등록하기 위해서는 설정 클래스파일에 @Configuration를 적용하고, 그 내부에서 스프링 빈으로 등록할 메서드에 대해 @Bean 어노테이션을 적용하면 스프링 컨테이너에 등록된다.

     

    @Configuration은 해당 빈 객체가 싱글톤으로 등록됨을 보장해준다.

     

    @Configuration
    public class ApConfig{
        @Bean
        public MemberService memberService(){
            return new ...
        }
    }

    위와 같은 형태로 구현해야한다.

     

    자동으로 등록하기

     

    스프링에서는 컴포넌트스캔을 이용해서 @Component가 붙은 모든 오브젝트를 빈으로 자동 등록시킨다.

    @Bean과 달리 개발자가 직접 변경이 가능한 대상에 사용된다.

    @Component
    class Utils {
       fun print() { }
    }

    위와 같이 공통적으로 사용하고 싶은 클래스가 있다면 클래스 이름 위에 @Component 어노테이션을 붙인다.

     

    Controller과 RestController

    controller은 주로 사용자의 요청을 처리하고 난 후 정해진 뷰에 객체를 넘겨주는 역할을 한다.

    대규모 서비스에서는 서비스1, 서비스2 등의 다양한 서비스가 있는데 이를 한 클래스에서 몰아서 처리하지 않고, Controller이라는 중간제어자를 만들어서 서비스1은 서비스1 컨트롤러가 맡고, 서비스2는 서비스2 컨트롤러가 맡는 것같이 역할에 따라 설계를 한다.

    이렇게 하면 개발비용과 유지보수비용이 줄어든다.

     

    스프링에서 controller을 쓰기 위한 어노테이션으로는 @Controller과 @RestController이 있다.

     

    @Controller

     

    주로 view를 반환하기 위해 사용된다.

    @Controller
    public class Controllerprac {
        @GetMapping("/home") //home으로 Get요청이들어오면
        public String homepage(){
            return "home.html"; //home.html생성
        }

     

    @RestController

     

    JSON/XML형태로 객체로 데이터를 반환한다.

    @RestController // JSON으로 데이터를 주고받음을 선언합니다.
    public class ProductRestController {
    
        private final ProductService productService;
        private final ProductRepository productRepository;
    
        // 등록된 전체 상품 목록 조회
        @GetMapping("/api/products")
        public List<Product> getProducts() {
            return productRepository.findAll();
        }
    }

     

     

    ControllerAdvice

    controllerAdvice는 여러 컨트롤러에 대해 전역적으로 ExceptionHandler을 적용해준다. 

    이를 통해 코드의 중복을 해결할 수 있다.

    또한 하나의 클래스 내에서 정상 동작 시 호출되는 코드와 예외를 처리하는 코드를 분리할 수 있다.

     

    장점 

    -모든 컨트롤러에 대한 예외처리를 하나의 클래스로 할 수 있다.

    -일관성있는 에러 응답을 보내줄 수 있다.

    -if,else 또는 try,catch를 사용하지 않아 코드의 가독성이 좋아지고 수정하기 용이하다.

     

    @ControllerAdvice
    public class SimpleControllerAdvice {
    
        @ExceptionHandler(IllegalArgumentException.class)
        public ResponseEntity<String> IllegalArgumentException() {
            return ResponseEntity.badRequest().build();
        }
    }

     

    위와 같이 구현하면 된다.

     

    interceptor

    컨트롤러(Controller)의 '핸들러(Handler)'를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할수 있는 일종의 필터이다.

    사용자의 요청으로 서버에 들어온 request객체를 핸들러로 도달하기 전에 낚아채서 개발자가 원하는 추가적인 작업을 한 후에 핸들러로 돌려보내주도록 한다.

     

    이는 특정 핸들러가 실행되기 전 또는 후에 개발자가 원하는 기능이 있을 때 활용된다.

     

     

    HTTP Method

    클라이언트 - 서버 구조에서 요청과 응답이 이루어지는 방식을 말한다.

     

    GET : 리스트를 조회하는 메서드

    POST : 데이터를 추가하거나 등록하는 메서드

    PUT : 리소스를 대체하거나 삭제한다.

    DELETE : 리소스를 삭제한다.

    PATCH : 리소스를 부분 변경한다.

     

    PUT는 전체를 변경하고, PATCH는 부분적으로 변경한다는 차이가 있습니다.

     

     

    status code

    HTTP 상태코드라고도 한다. 서버에서의 처리 결과를 알 수 있다.

    • XX: Informational(정보 제공)
      • 임시 응답으로 현재 클라이언트의 요청까지는 처리되었으니 계속 진행하라는 의미입니다. HTTP 1.1 버전부터 추가되었습니다.
    • 2XX: Success(성공)
      • 클라이언트의 요청이 서버에서 성공적으로 처리되었다는 의미입니다.
    • 3XX: Redirection(리다이렉션)
      • 완전한 처리를 위해서 추가 동작이 필요한 경우입니다. 주로 서버의 주소 또는 요청한 URI의 웹 문서가 이동되었으니 그 주소로 다시 시도하라는 의미입니다.
    • 4XX: Client Error(클라이언트 에러)
      • 없는 페이지를 요청하는 등 클라이언트의 요청 메시지 내용이 잘못된 경우를 의미합니다.
    • 5XX: Server Error(서버 에러)
      • 서버 사정으로 메시지 처리에 문제가 발생한 경우입니다. 서버의 부하, DB 처리 과정 오류, 서버에서 익셉션이 발생하는 경우를 의미합니다.