Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[이단] Chapter 8. API 응답 통일 & 에러 핸들러 #47

Merged
merged 3 commits into from
Jun 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions docs/chapter8/Ch08Keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# 8주차 키워드 정리

---

## Spring의 의존성 주입

여러 클래스 또는 인스턴스가 있을 때, 특정 클래스가 다른 클래스를 필드 등으로 참조하고 있는 상황이 있다. 이때, 해당 클래스의 인스턴스가 생성될 때, 참조하고 있는 클래스에 대한 인스턴스를 연결시켜주는 행위를 의존관계 주입이라고 한다.

의존관계 주입에는 크게 4가지 방법이 있다.

- **생성자 주입**
- **setter 주입(또는 수정자 주입)**
- **필드 주입**
- **일반 메소드 주입**

### ⭐생성자 주입⭐(권장)

생성자를 이용하여 의존관계를 주입하는 방식이다.

- 생성자 호출 시점에 **딱 1번만 호출되는 것이 보장**된다.
- 위 특징을 이용해, 의존관계를 수정하지 못하도록 setter 미사용, final 필드 이용 등의 코드 작성까지 이용하여 **불변, 필수 의존관계**에 사용된다.

> **중요 포인트**
> 생성자가 1개만 있으면, `@Autowired` 어노테이션을 생략할 수 있다! 스프링이 해당 빈을 등록할 때 선택할 수 있는 생성자가 1개이기 때문이다.
> <br/> 이는 코드를 작성할 때 매우 빈번하게 사용할 수 있는 포인트이다.

### setter 주입(수정자 주입)

setter라 불리는 필드의 값을 변경하는 수정자 메소드를 통해서 의존관계를 주입하는 방식이다.

- 선택적이고(아래 알아둘 점 참고), 변경 가능성이 있는 의존관계에 사용된다.

> **알아둘 점**
> **`@Autowired` 어노테이션의 기본 동작**은 **주입할 대상이 없으면 오류가 발생한다.**
> <br/> 주입할 대상이 없어도 동작하게 하려면, `@Autowired(required = false)`로 지정하면 된다.


### 필드 주입

필드에 바로 주입하는 방식입니다.

- 코드가 간결하지만, **외부 변경이 불가능해 테스트하기 힘들다는 치명적 단점이 있다.**
- 즉, DI 프레임워크가 없으면 아무것도 할 수 없다.
- **⇒ 아래의 경우 말고는 사용하지 말자!**
- 어플리케이션의 실제 코드와 관계 없는 테스트 코드
- 스프링 설정을 목적으로 하는 `@Configuration` 같은 곳

### 일반 메소드 주입

일반 메소드를 통해서 의존관계를 주입하는 방식이다.

- 한 번에 여러 필드를 주입받을 수 있다.
- 일반적으로 잘 사용하지 않는다.


## IoC 컨테이너

개발자가 객체의 생성, 삭제와 같은 흐름을 직접 제어하지 않고, 이러한 권한을 스프링에게 위임해 스프링이 이를 대신 처리하는 것을 `IoC`, Inversion Of Control라고 한다. 이러한 IoC를 담당하는 `Spring Container`를 `Ioc Container`라고도 한다.


## RestContollerAdvice

`@RestControllerAdvice` 어노테이션은 `@ControllerAdvice`에 `@ResponseBody` 어노테이션을 끼얹은 형태라고 할 수 있다.

이때, `@ResponseBody`는 응답을 Response Body에 JSON의 형태로 매핑시키는 역할을 한다.

`@ControllerAdvice`는 `@ExceptionHandler`가 선언된 컨트롤러 클래스 하위에서 발생하는 예외만 처리하도록 하는 것과 달리, 모든 컨트롤러의 하위에서 발생하는 예외를 ‘**전역적으로 처리**’하는 역할을 한다. 즉, 단 하나의 예외처리 핸들러 클래스를 통해 모든 예외를 처리할 수 있게 되는 것이다.

## lombok

`Lombok`이란, 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다. Lombok을 통해 빈번히 작성이 필요한 Getter, Setter, Constructor 등과 같은 코드를 직접 작성할 필요 없이 자동완성되도록 할 수 있다.

Lombok의 장점은 다음과 같다.

- 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
- 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상
- Getter, Setter 외에 빌더 패턴이나 로그 생성 등, 다양한 방면으로 활용 가능
24 changes: 24 additions & 0 deletions src/mission/chapter8/Ch08Mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
`ErrorCode` 인터페이스 추상화 후, 도메인별 분리된 `XXXErrorCode` 클래스를 생성하여 `ErrorCode`를 implement하도록 구조 설계

![image](https://github.com/SSUMC-6th/Spring_Boot_A/assets/67828333/51f72008-8844-426f-946a-2b175f5ae4d4)

`ErrorCode`를 implement하는 `GlobalErrorcode`

![image](https://github.com/SSUMC-6th/Spring_Boot_A/assets/67828333/c274ee5f-45a2-414a-86d2-ce3b9e5c2ce2)

`ResponseEntityExceptionHandler` 추상 클래스를 상속함으로써, Spring MVC 내부의 예외도 처리할 수 있도록 설정. `@RestControllerAdvice` 어노테이션을 통해 프로젝트의 모든 컨트롤러 내부에서 발생하는 예외에 대한 전역적인 처리를 수행하도록 하고, 내부에 설정된 `@ResponseBody`를 통해응답을 JSON으로 매핑하도록 설정.

![image](https://github.com/SSUMC-6th/Spring_Boot_A/assets/67828333/87c48dbc-153c-4921-a8f9-a10a40aca8c0)

input이 1인 경우 `200 OK` 응답

![image](https://github.com/SSUMC-6th/Spring_Boot_A/assets/67828333/3084da49-04a7-4211-8809-1d479cec01c0)

input이 0인 경우 `400 BAD REQUEST` 응답

![image](https://github.com/SSUMC-6th/Spring_Boot_A/assets/67828333/0e2c36fb-6f94-418d-8acd-7db7a08bc23e)
> **github 링크**
>
>
> https://github.com/bflykky/umc-workbook/tree/week6
>