본문 바로가기

백엔드 잡학사전

[스프링 리뷰]

스프링

 

기본적으로는 JAVA 진영에서 가장 많이 사용되는 프레임워크.

다시말해, 개발자가 애플리케이션을 개발하고 싶은데 JAVA 언어를 쓰고 싶다면, 그걸 잘 도와주는 아이가 스프링이다.

개발자가 비즈니스 로직에 더 집중할 수 있도록 기술적인 부분을 관리해줌.

 

다양한 모듈로 구성되어 있다. 핵심 컨테이너, 웹, 데이터, 메시징, AOP 등의 모듈이 있는데 개발자가 필요에 따라 선택적으로 사용할 수 있음.

 

중요한 디자인 패턴으로는 의존성 주입 (Dependency Injection), 제어역전 (Inversion of Control), 관점 지향 프로그래밍 (AOP) 등이 있음 => 궁극적으로는 느슨한 결합 (Loose Coupling)을 달성할 수 있음. 느슨한 결합은 단위 테스트를 수행하기 용이함.

 

 

 

* 의존성 주입 Dependency Injection

 

 

객체가 필요로 하는 의존 객체를 외부에서 제공(주입)하는 방식.

자신이 사용할 의존 객체를 직접 생성하지 않고, 외부에서 생성된 객체를 주입받기 때문. 이로 인해 객체는 자신의 구현에만 집중할 수 있고, 변경에 유연하게 대응할 수 있음. 객체간의 결합도가 낮아짐. 순수함수와 매우 유사한 성질.

 

DI를 사용하지 않은 코드라면, 특정한 객체에 의존성이 높아지고, Tight Coupling이 발생하면서 단위 테스트가 어렵게끔 만듦. Mock 객체를 사용할 수 없음.

DI를 사용한다면, @Service, @Autowired 어노테이션을 통해 MyService 인스턴스를 획득, 단위테스트 상황에서 Service 객체를 Mock 객체로 대체하여 쉽게 테스트할 수 있음.

 

@Autowired가 없이도 물론 DI 가능하지만, Autowired를 활용하면 객체를 직접 주입할 필요없이 의존 객체를 찾아서 주입해준다. 이전보다 편하게 만들어주는 것.

 

의존성 주입은 필드 주입, 수정자 주입, 생성자 주입 이렇게 있는데 그중 생성자 주입이 으뜸이다.

 

그 이유는 여러가지가 있다. 우선 나머지 주입들의 단점들이 있다. 예를 들어, 수정자 주입의 경우 다른 곳에서 임의로 객체를 변경할 수 있기 때문에 에러가 발생할 가능성이 높고, 필드 주입의 경우 순환참조 에러를 방지할 수 없다. 그러나 생성자 주입의 경우에는 생성자로 처음에 주입받을 시에 들어온 값이 불변한다. 그렇기 때문에 final 키워드를 사용할 수도 있다. 또한 순환참조가 있는 경우 컴파일 시점에 알려준다.

 

 

 

* 제어역전 (Inversion of control)

 

객체가 스스로를 제어하는 대신, 프레임워크나 외부 컨테이너가 그 제어권을 갖는 설계 패턴.

Spring이 객체 간의 의존성을 관리함으로써, 개발자는 코드를 더 유연하고 모듈화된 방식으로 작성할 수 있음.

 

DI와 IoC의 관계: @Autowired를 사용한 DI가 IoC의 일반적인 구현 방법이라고 한다!!!!

 

 

 

* 관점 지향 프로그래밍 (AOP)

 

 

 

* Service, Controller, Repository 이들 사이의 관계는 어떻게 되는가 과연? MVC 패턴

 

 

MVC 패턴은, Model, View, Controller의 다양한 컴포넌트들의 줄임말. 앱을 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴을 의미.

사용자 인터페이스로부터 비즈니스 로직을 분리하여 서로 영향없이 쉽게 고칠 수 있는 설계가 가능.

 

Controller는 Model과 View 사이의 브릿지 역할을 수행. Spring에서 @Controller로 사용.

유저로부터 인풋을 받은 후, 그에 대한 응답으로 모델 및 뷰를 업데이트 하는 로직을 포함함.

사용자의 요청은 모오두 컨트롤러를 통해 어떻게 처리할지 결정하여, 모델로 요청을 전달해야 함.

 

Model은 비즈니스를 처리하는데, Spring에서는 @Service, @Repository 등이 포함됨. 비즈니스 규칙을 담당하고, 데이터를 가공하거나 계산하는 부분.

 

View는 보이는 부분. JAVA-Spring에 해당하는 기능이 없으므로 보통 JSP, Thymeleaf, React 등으로 구현됨.

 

MVC의 단점은? M/V의 의존성을 완전히 분리시킬 수 없음. 또 프로젝트의 규모가 커지면 Controller의 비중이 높아짐.

 

 

 

* RESTful API란?

 

서버와 클라이언트의 통신 방식 중 하나임.

1 자원의 이름으로 자원의 상태를 구분함 -> URI 사용한다는 뜻

2 HTTP Method를 통해 자원을 교환함 -> Create, Read, Update, Delete 사용한다는 뜻

3 Stateless -> 요청끼리는 서로 독립적임. 그러니까, 서버는 각각의 요청을 완전히 별개의 것으로 인식.

4 Cacheable -> 대량의 요청을 효율적으로 처리하기 위해 캐시를 사용

 

자원에 대한 조작은 HTTP Method를 통해 표현 - CRUD를 통해 진행되어야 함.

 

RestController는 뭐지? 그냥 Contoller는 왜 안 좋아?

=> RestContoller는 REST API 설계에 사용할 수 있도록 제공하는 특별한 형태의 컨트롤러이기 때문에 이를 쓰는 게 좋다.

가 아니라,,, Controller는 view를 반환하지만, RestController는 view가 아닌 data를 반환하기 때문에 API 엔드포인트를 만들 때 사용됨.

 

* Spring에서는 @GetMapping, @PostMapping, @DeleteMapping 이런 애노테이션들로 활용함.