이번 과제는 주어진 주제에 대해 공부해보는 것이다.
시작!
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 처리 과정 오류, 서버에서 익셉션이 발생하는 경우를 의미합니다.
'Back-end > 멋쟁이사자처럼' 카테고리의 다른 글
[멋쟁이사자처럼] level6 구현 (0) | 2024.04.02 |
---|---|
[멋쟁이사자처럼] 질문 정리 과제 (0) | 2024.03.27 |
[멋쟁이사자처럼] level5 구현 (0) | 2024.03.19 |
[멋쟁이사자처럼] level1~4 구현 (0) | 2024.03.12 |
[멋쟁이사자처럼] 1주차 정기세션(HTTP, REST_API) (1) | 2024.03.12 |