-
Spring
Java기반의 웹 애플리케이션 프레임워크이다.
동적인 웹사이트를 개발하기 위한 서비스들이 제공된다.
레포지토리, 서비스, 컨트롤러의 계층의 의존성을 스프링 프레임워크가 연결해준다.
스프링 프레임워크가 필요에 따라 사용자의 코드를 호출하는, 제어 역전이 나타난다.
https://spring.io/ 동적 웹
정적 웹과 대조되는 개념이다.
옛날 옛적에는 정적인 웹이 주로 제공되었었다.
정적인 웹은 말 그대로 바뀌지 않는, 이미 완성품이 제작된 상태에서 서버가 제공만 하는 형태였다.
예를 들면 회사 소개 웹사이트의 경우에는 이미 소개 내용이 작성된 상태에서 서버가 제공만 하기 때문에 정적 웹에 해당한다.
동적 웹은 사용자가 방문할 때 다른 내용이 제공될 수 있는 웹이다.
예를 들면 게시판의 경우 게시판에 글을 쓸 때마다 목록이 바뀌기 때문에 서버가 정적으로 제공하려면 글이 작성될 때마다 내용을 바꿔서 제공해줘야하기 때문에 매우 번거로울 것이다.
이런 경우에 클라이언트의 요청에 따라 다양한 응답을 줄 수 있는 동적 웹이 필요하다.
Spring Boot
스프링부트도 스프링처럼 Java 기반 웹 프레임워크인데,
Spring프레임워크에 톰캣 서버와 여러 기능들이 추가된 웹 프로그램을 쉽게 만들 수 있게 해주는 프레임워크이다.
스프링부트는 보안 기능도 기본적으로 내장하고 있어서 SQL인젝션, XSS, CSRF, 클랙재킹 등의 보안 공격을 막아준다.
Spring initializer
스프링부트 프로젝트를 웹사이트에서 쉽게 생성할 수 있게 해주는 도구이다.
https://start.spring.io/ 에서 확인할 수 있다.
프로젝트 종류와 언어, 스프링부트 버전을 선택해주고, 프로젝트 메타 데이터와 의존성 설정을 해주고 GENERATE을 클릭하면 프로젝트가 다운로드 된다.
jar 파일
java archive의 약자이다.
jar는 자바 클래스 파일들과 리소스(사진 등)와 메타 데이터를 하나의 파일로 모은 압축 파일이다.
war 파일
web application archive의 약자이다.
jar파일과 비슷하게 자바 클래스, 파일ㄷ 등 웹 애플리케이션을 이루는 자원을 하나로 모은 압축 파일이다.
JRE만 있으면 실행할 수 있는 jar파일과 달리 웹서버나 WAS가 있어야 실행 가능하다.
MVC(Model–view–controller)
관심사에 따라 model과 view와 controller로 분리한 GUI에 사용하던 소프트웨어 디자인 패턴이다.
MVC패턴은 비즈니스 로직(모델)과 보이는 부분(뷰)을 구분하는데 중점을 둔다.
모델은 데이터와 비즈니스 로직을 관리하고,
뷰는 보이는 부분을 담당하고,
컨트롤러는 사용자의 입력에 대한 처리를 해준다.
Spring MVC
Spring MVC는 MVC디자인 패턴을 이용해서 웹 어플리케이션을 만들 수 있게 도와주는 웹 프레임워크이다.
모델은 비즈니스 로직을 다루고,
뷰는 보여주는 부분을 처리해준다.
컨트롤러는 URL과 메소드에 따라 매핑을 해주는 역할을 한다.
Spring 어노테이션
어노테이션은 런타임에 적용되는 주석인데, 추가적인 정보를 붙여주고, 특별한 기능을 사용할 수도 있게해준다.
Spring 어노테이션으로 클래스의 역할을 정하거나
Tomcat
WAS(web application server)의 일종이다.
요즘은 Nginx도 많이 사용하지만, Nginx가 나오기 전에 동적 웹을 제공할 때 Tomcat을 주로 사용했다.
소프트웨어 디자인 패턴
디자인 패턴은 개발을 할 때 자주 발생하는 상황에 대한 설계 방법을
다음에 또 발생했을 때 적용할 수 있게 정리해둔 해결책이다.
싱글톤 패턴이나 전체적인 레이아웃은 통일해둔 상태에서 살짝의 변조를 주고 싶은 경우에 사용하는 템플릿 메소드 패턴 등이 있다.
@Controller 과 @RestController
MVC에서 컨트롤러에 해당하는 클래스에 붙여주는 어노테이션이다.
@Controller는 주로 View를 반환하기 위해 사용한다.
@ResponseBody는 JSON형태로 값을 반환해준다.
Spring4.0전까지는 @Controller와 @ResponseBody를 함께 사용했어야 했지만
@Controller와 @ResponseBody를 합친 @RestController가 나와서 @RestController를 사용하면 된다.
@WebMvcTest
Spring MVC components에 대한 테스트를 할 때 사용할 수 있는 어노테이션이다.
Service나 Repository등에 dependancy가 있는 경우 @MockBean으로 주입해서 테스트를 할 수 있다.
@MockMvc
서버의 MVC동작을 테스트할 수 있게 하는 어노테이션이다.
@Autowired
자동적으로 의존성을 주입해주기 위해 사용한다.
MVC의 model vs domain model
MVC의 model은 보여주는 부분인 view와 사용자 입력에 대한 처리 부분인 controller를 제외한 모든 부분이다.
도메인 모델은 실질적으로 문제 해결 영역에 대한 개념 모델이다.
Spring을 사용하는 이유
스프링을 사용하면 의존성 주입을 스프링에게 맡기고 핵심 비즈니스로직 개발에 집중할 수 있다.
service 이용 → 관심사의 분리
Service계층을 이용하면 controller의 관심사를 특정 path와 메소드에 대한 처리 방식을 결정하고 응답해주는 것으로 한정지을 수 있게 된다.
그리고 service는 기능 그 자체를 다룬다.
DI (Dependency Injection)
의존하는 객체를 내부에서 생성하지 않고, 외부에서 선언하고 주입받아서 사용하는 것을 의존성 주입이라고 한다.
의존성 주입을 통해 결합도를 낮춰서 유지 보수가 용이한 프로그램을 만들 수 있다.
스프링 프레임워크에서는 필드 주입, 세터 주입, 생성자 주입 세가지 방식으로 의존성 주입이 가능한데,
Spring 4.3이후로는 생성자 주입 방식이 권장되고 있다.
ApplicationContext
ApplicationContext는 스프링 IoC container에 해당한다.
스프링 IoC container는 객체들의 인스턴스화, 연결, 관리 등을 담당한다.
ApplicationContext는 스프링 컨테이너 최상위 인터페이스인 BeanFactory의 하위 인터페이스이다.
ApplicationContext는 빈을 싱글톤으로 관리해줘서 매번 인스턴스를 생성하지 않도록 해서 오버헤드를 줄일 수 있다.
ApplicationContext는 어노테이션 기반 의존성 주입 등의 BeanFactory를 확장한 기능들이 있어서 ApplicationContext를 많이 사용한다.
@SpringbootApplication
스프링부트의 기본적인 설정을 해주는 어노테이션으로,
@EnableAutoConfiguration, @ComponentScan, @Configuration을 합친 것이다.
@ComponentScan은 @Component어노테이션이 붙어있는 class를 Bean으로 등록해주고,
@EnableAutoConfiguration은 미리 정의된 자바 설정 파일들을 Bean으로 등록해준다.
@Configuration은 현재 클래스가 하나 이상의 @Bean 메소드를 선언했다는 것을 알려줘서
스프링 컨테이너가 Bean을 등록할 수 있도록 해준다.
@AutoConfigureMockMvc
@SpringBootTest만으로는 빈으로 등록되지 않는 MockMvc를 등록해서
MockMvc가 제공하는 메서드를 사용할 수 있게 해준다.
Spring component scan
스프링 컴포넌트 스캔은 @Component어노테이션이 붙은 클래스들을 빈으로 등록해주는 것을 의미한다.
@Component
Spring의 Bean으로 등록할 때 사용하는 어노테이션이다.
@Repository
리포지토리에 해당하는 persistence layer의 클래스들에 붙여주는 어노테이션이다.
Bean
스프링 IoC컨테이너가 관리하는 자바 객체를 빈이라고 한다.
@Bean
개발자가 직접 제어할 수 없는 외부 라이브러리 등을 Bean으로 만들려고 할 때 사용된다.
Singleton 패턴
소프트웨어 디자인 패턴의 일종이다.
인스턴스가 프로그램에서 딱 한 개만 생성되어 공유되는 패턴이다.
싱글톤 패턴을 활용하면 전역적으로 동일한 인스턴스에 접근하게 된다.
테스트하기 어렵다는 단점을 가지고 있다.
Spring 프레임워크는 싱글톤의 단점을 보완하여 싱글톤 패턴을 사용한다.
싱글톤 객체를 만들고 관리하는 싱글톤 레지스트리를 이용해서 빈을 싱글톤으로 관리한다.
Layered Architecture
layered architecture는 가장 많이 쓰이는 아키텍처 패턴 중 하나이다.
각 계층마다 다른 관심사를 갖게 하고, 그 계층들이 협력하여 하나의 소프트웨어를 이룬다.
사용자와 상호작용을 하는 계층과, 비즈니스 로직을 다루는 계층과, 데이터를 다루는 계층과 데이터베이스를 다루는 계층 등으로 나눌 수 있다.
관심사에 따라 계층을 나눔으로써 응집도는 높이고 결합도를 낮춰서 유지보수를 쉽게 해준다.