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

[멋쟁이사자처럼] 질문 정리 과제

by 잔디🌿 2024. 3. 27.

    이번에는 과제로 나온 질문들에 대한 답을 찾아 정리하겠다!

     

    1. 의존성을 주입하는 방법에는 무엇이 있는가? 각 방법의 장단점은 무엇인가? 어떤 기준으로 나눠서 사용하는가?

     의존성을 주입하는 방법에는 3가지가 있다.

     

    - 생성자 주입

    - 필드 주입

    - 수정자 주입

     

    스프링에는 @Autowired 어노테이션을 이용한 다양한 의존성주입 방법을 제공한다. 의존성 주입은 필요한 객체를 직접 생성하는 것이 아니라 외부로부터 객체를 받아서 사용한다.

     

    1. 생성자 주입

    @Controller
    public class CocoController {  
           //final을 붙일 수 있음
           private final CocoService cocoService;
           //---------------------------------------------------------  
           //@Autowired
           public CocoController(CocoService cocoService) {
                this.cocoService = cocoService;
                }
      }

     

    클래스의 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어있으면 위와 같이 @Autowired를 생략할 수 있다.

     

    2.필드 주입

     

    @Controllerpublic
    class CocoController {
        @Autowired
        private CocoService cocoService;
        }

    필드에 @Autowired어노테이션을 붙이면 자동으로 의존성 주입이 된다. 

    장점 : 사용법이 간단하다

    단점 : 코드가 간결하지만 외부에서 변경하기 힘들고, 프레임워크에 의존적이라 객체지향적으로 좋지 않다.

     

    3. 수정자 주입

    @Controllerpublic
    class CocoController {
           private CocoService cocoService;
           @Autowired
           public void setCocoService(CocoService cocoService) {
               this.cocoService = cocoService;  
               }
    }

     

    Setter 메소드에 @Autowired어노테이션을 붙이면 된다.

    단점 : 수정자 주입을 사용하면 set메서드를 public으로 열어두어야하기 때문에 언제 어디서든 변경이 가능하다.

     

    <어떤 기준으로 나누어서 사용하는가?>

    가장 기본적으로 생성자 주입 방법을 사용한다.

    하지만 의존성을 변경할 필요가 있다거나 외부에서 의존성을 바꿔줄 필요가 있다면 Setter 주입 방법을 사용한다. 

    또, 테스트시에는 생성자와 Setter가 불필요하기에 필드 주입으로 간결하게 사용한다.

     

     

    2. DI란 무엇인가? 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, 의존관계 주입
    
            // ...
        }
    }

     

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

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

     

    DI의 장점

    -코드의 재사용성, 유연성이 높아진다. 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.

    -객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야하는 상황을 막아준다.

    -유지보수가 쉬우며 테스트가 용이해진다.

    -확장성을 가진다.

     

    3. 빈의 스코프는 무엇인가?

    빈 스코프란?

    빈은 스프링 컨테이너가 시작될 때 생성되고, 스프링 컨테이너가 종료될 때까지 유지된다. 이것은 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프란 빈이 존재할 수 있는 범위를 뜻한다.

     

    4. 모든 객체를 스프링 빈으로 등록해도 괜찮나? 안된다면 특정 객체만 빈으로 등록해야 하는 이유는 무엇인가?

     모든 객체를 스프링빈으로 등록하면 메모리 사용량이 많아짐에 따라 애플리케이션 성능에 문제가 생길 수 있다.


    5. 빈으로 등록하는 것과 static 메서드를 사용할 때를 구분하는 기준은 무엇인가?

     

    빈으로 등록할 때

     

    특정 메소드를 호출하고자 할 때 static이 아니라면 객체를 new해서 newClass.method 와 같은 방식으로 사용해야한다. 하지만 이런 방식은 스프링의 IOC 에 맞지 않는다. IOC는 객체의 생성, 소멸 권한을 IOC컨테이너에 넘겼는데 그 외적인 부분에서 생성을 하기 때문이다. 이럴 경우에는 bean등록하는 것이 좋다.

     

    static으로 등록할 때

     

    static으로 선언시 static 영역에 있으므로 속도, 메모리적으로 이득을 볼 수 있지만 만들어진 static 안에서 다른 객체를 생성하거나 호출 할 때 의존성 주입을 사용할 수 없다. 그 객체에 대한 생성, 소멸을 직접 관리해야되기에 불편하다.

    메소드가 외부 자원에 의존하지 않고 수신한 매개변수에 대해서만 처리를 수행할 경우 , 객체 생성이 필요 없을 경우 static메소드를 사용해도 좋다.

     

    6. Configuration을 관리하는 방법은 어떤 것이 있는가? 각 방법의 장단점은 무엇인가?

    configuration은 빈을 등록할 수 있는 어노테이션 중 하나이다.

    @Configuration 어노테이션을 사용하면, 하나 이상의 @Bean이 붙은 메서드가 포함된 빈 설정용 클래스를 만들 수 있다.

    @Configuration
    public class Config {
    
        @Bean
        public MyBean myBean() {
            return new MyBean();
        }
    }

     

    위와 같이 빈을 설정할 수 있다.

    (관리하는 방법은 못찾겠어요...)


    7. @Controller와 @RestController의 역할과 차이점은?

     

    @Controller은 주로 View를 반환하기 위해 사용된다. 사용자의 요청을 처리하고, 요청의 결과를 반환한다.

    @RestController 어노테이션은 Restful Web Service에서 사용되는 컨트롤러 어노테이션이다. JSON형태의 객체 데이터를 반환한다.

     

    @Controller과 RestController의 차이점은 

     

    1. @Controller는 클래스를 Spring MVC 컨트롤러로 표시하는데 사용되며, @RestController는 RESTful 웹 서비스에서 사용되는 특수 컨트롤러이며 @Controller + @ResponseBody와 동일하다

     

    2. @RestController는 Spring4.0에서 추가되었지만, @Controller는 Spring이 주석을 지원하기 시작한 이후에 존재하며 공식적으로 Spring 2.5버전에서 추가되었다

     

    3. @Controller는 @Component 주석이 달려있고, @RestController는 아래와 같이 @Controller와 @ResponseBody 주석이 달린 편의 컨트롤러이다


    8. ControllerAdvice를 사용할 수 있는 사례는 무엇이 있는가?

    API 동작 중에 예외가 발생했을 때 예외를 바로 사용자에게 반환하는 것은 사용자 입장에서 불필요하다. 이를 적절하게 처리하기 위해서 사용하는 것이 ControllerAdvice이다. 

    이는 컨트롤러가 본인의 역할에 집중할 수 있도록 해주고, 코드의 중복도 제거할 수 있고, 관심사의 분리도 이룰 수 있다.

     

    ControllerAdvice는 애플리케이션 내 모든 컨트롤러에서 예외가 발생할 때 사용하여 이를 처리할 수 있다.

     

    9. Interceptor와 Filter의 역할과 차이점은?

     

    Filter은 J2EE표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 url패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.

     

    interceptor은 필터와 달리 Spring이 제공하는 기술로써 디스패처 서블릿이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다. 

     

    필터는 스프링의 예외처리가 되지 않지만 인터셉터는 된다.

     

    필터는 Request/Response객체조작이 가능하지만 인터셉터는 불가능하다

     

    필터는 공통된 보안 및 인증/인가 관련 작업을 하고, 모든 요청에 대한 로깅 또는 감사, 이미지/데이터 압축 및 문자열 인코딩, Spring과 분리되어야 하는 기능이다. 

     

    인터셉터는 세부적인 보인 및 인증/인가 공통 작업을 하고,, API 호출에 대한 로깅 또는 감사, Controller로 넘겨주는 정보의 가공을 한다.

     

    10. HTTP 메서드 종류에는 무엇이 있는가? 각각의 목적은 무엇인가?

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

     

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

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

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

    DELETE : 리소스를 삭제한다.

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

     

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

     

    11. HTTP 상태 코드 중 200, 400, 500번 대의 차이는 무엇인가?

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

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

     

     

    https://dev-coco.tistory.com/70

     

    [Spring] 의존성 주입 3가지 방법 - (생성자 주입, Field 주입, Setter 주입)

    Spring은 @Autowired 어노테이션을 이용한 다양한 의존성 주입(DI; Dependency Injection) 방법을 제공합니다. 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것입

    dev-coco.tistory.com

     

    https://velog.io/@sana/DI-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85Dependency-Injection-%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EB%B0%A9%EB%B2%95

     

    [DI] 의존성 주입(Dependency Injection) 의 개념과 방법 및 장단점

    의존성 주입의 역할 어떤 상황에서 필요할까? 우선 의존성에 대해 개념적으로 이해하기 위해 다음의 예시들을 생각해보자. [예시1] 집에서 베이킹을 하면 주방이 어질러지고 난리나니 케이크 배

    velog.io