스프링 핵심 원리 - 입문편(정리)

해당 글은 인프런에서 제공하는 무료 강의를 개인적으로 정리한 내용으로 김영한님의 강의를 듣고자 하시는 분은 아래 링크를 타서 시청하시면 되겠습니다.  

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com


# ViewResolver

Spring Framework에서 ViewResolver는 HTTP 요청 결과를 적절한 View(화면)으로 매핑해주는 인터페이스입니다. 즉, Controller에서 반환한 모델 데이터를 기반으로, 적절한 뷰를 선택해 HTML, JSP, PDF, Excel, JSON 등의 형식으로 출력해주는 역할을 합니다.

client 요청에 따른 viewResolver 작동 흐름도


Spring에서는 다양한 ViewResolver를 제공하며, ViewResolver는 설정 파일(XML, Annotation)을 통해 등록할 수 있습니다. 대표적으로 사용되는 ViewResolver 는 InternalResourceViewResolver, ResourceBundleViewResolver, ContentNegotiatingViewResolver 등이 있습니다.

 

  • InternalResourceViewResolver: JSP 파일을 뷰로 사용하는 경우, JSP 파일의 경로와 확장자를 설정할 수 있습니다.
  • ResourceBundleViewResolver: properties 파일을 뷰로 사용하는 경우, properties 파일의 경로를 설정할 수 있습니다.
  • ContentNegotiatingViewResolver: HTTP 요청의 Accept 헤더에 따라 적절한 뷰를 선택해 출력해줍니다.

 

ViewResolver는 뷰 선택에 대한 로직을 추상화하고, 유연한 View를 선택할 수 있도록 도와줍니다. 이를 통해, 개발자는 다양한 뷰 기술을 적용할 수 있으며, 프레임워크에서 제공하는 뷰를 이용해 일관된 구조와 스타일을 유지할 수 있습니다


# build 및 배포 준비

Window 환경에서 서버를 배포를 하려고 할 때 유용하게 사용될 명령어들을 순서 대로 나열 하면 아래와 같습니다. 

 

  • 실행 파일이 있는 위치에서 주소창에 cmd를 입력 하면 콘솔창이 뜹니다. 

  • cmd 에 gradlew.bat 입력
  • cmd 에 gragdlew build 입력
  • cd build/libs 로 이동
  • java -jar hello-spring-0.0.1-SNAPSHOT.jar 입력 hello-spring-0.0.1-SNAPSHOT.jar 여기 부분은 자신이 만든 프로젝트 명으로 변경해야됩니다. 

# 정적 컨텐츠 제공 방식

서버 url에 static 자원을 요청하는 주소가 들어오는 경우, 우선적으로 Controller에서 처리 할 수 있는 url인지 확인을 하고 처리 할 수 없는 url이라고 판단이 되면 정적 컨텐츠 파일로 찾아가서 파일을 찾아서 반환하는 흐름으로 이해하시면 됩니다.

정적 컨텐츠를 제공하는 흐름도


# MVC와 템플릿 엔진

MVC는 Model-View-Controller의 약자로, 소프트웨어 아키텍처 디자인 패턴 중 하나입니다. 

MVC 패턴은 애플리케이션을 세 가지 요소로 분리합니다.

  • Model: 애플리케이션의 상태와 동작을 관리하는 부분으로, 비즈니스 로직과 데이터 관리를 처리합니다.
  • View: 사용자 인터페이스(UI)를 나타내는 부분으로, 사용자에게 보여지는 부분을 담당합니다.
  • Controller: 사용자의 요청을 처리하고, 모델과 뷰 사이에서 중개자 역할을 합니다. 사용자가 요청하는 데이터를 모델에서 가져와서 뷰에 전달하거나, 뷰에서 사용자의 입력을 받아 모델에 전달합니다.

MVC 흐름도

  • Client 요청 Url에 mapping된 controller 호출.
  • 해당 controller는 Buisness Logic 호출후, 반환 되는 값을 model로 전달.
  • Contoller 는 Client요청에 알맞는 view Name을 ViewResolver에게 전달.
  • ViewResolver는 Model값을 바탕으로 page Rendering.
  • Client는 반환된 view를 확인.  

# @ResponseBody

@ResponseBody 어노테이션을 사용하게 되는 경우, ViewResolver를 사용하는 것이 아닌 반환 타입에 따라서 HttpMessageConverter가 수행이 됩니다. 

 

Converter의 종류

  • 기본 문자열인 경우 - StringHttpMessageConverter가 수행.
  • 기본 객체인 경우 - MappingJackson2HttpMessageConverter 가 수행.

@ResposeBody를 사용시에 따른 흐름도


# 클래스의 의존관계

모든 클래스간의 의존 관계는 직접적인 상속을 가지는 것이 아닌 interface를 통하여 해당 객체와의 의존관계를 가져야 합니다. 이와 같이 구현하는 이유는 객체지향프로그래밍을 구현하기 위함으로써 좋은 프로그래밍을 위한 SOLID법칙을 준수 한다고 생각하면 됩니다. 

 

 

객체 지향 프로그래밍(OOP)

객체지향프로그래밍(OOP) 객체지향프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그램을 객체(Object)라는 개별 단위로 분류하여 여러 객체들 간의 상호작용

jamesblog95.tistory.com


# @AfterEach, @BeforeEach

@AfterEach와 @BeforeEach는 JUnit5 사용 환경에 있어서 테스트 시작 이전과 이후에 이루어져야 하는 메소드들에 사용을 하여 문제를 사전예방을 하는데에 목적을 둡니다. 

 

추가로, 테스트 진행시에는 각각의 테스트들은 독립적으로 실행되어야 하는 하며, 독립적으로 실행된 테스트가 좋은 테스트라고 할 수 있습니다. 

 

# 예시

 @AfterEach
 public void afterEach() {
 	repository.clearStore();
 }
 
 @BeforeEach
 public void beforeEach() {
     memberRepository = new MemoryMemberRepository();
     memberService = new MemberService(memberRepository);
 }

# @Autowired, @Component

Spring에서의 핵심 기능 중 하나는 Bean 이라는 것을 Container 라는 곳에서 관리를 해줌으로서 해당 객체가 필요로 하는 시점에 자동으로 주입해주는 역할을 해주고 있습니다. 

 

여기서 자동으로 주입을 해주는 위치를 인식하는 어노테이션이 @Autowired 이며, Bean을 Container에 등록 하는 어노테이션은 @Component 입니다. 

 

@Component의 종류

  • @Controller
  • @Service
  • @Repository

# 수동 빈 등록하는 방법

설정 클래스에서 @Configuration을 사용하고 필드에 의존성 주입 메소드를 작성후 @Bean을 입력하게 되면 프로그램 수행시 자동으로 입력하는 동작을 수행합니다. 

 

@Configuration
public class SpringConfig {

 @Bean
 public MemberService memberService() {
 	return new MemberService(memberRepository());
 }
 @Bean
 public MemberRepository memberRepository() {
	return new MemoryMemberRepository();	
 }
 
}

 

@Configuration을 사용하게 되면 @ComponentScan을 자동적으로 수행을 하게 되므로 해당 패키지와 동등한 레벨 또는 하위 레벨에 @Component 어노테이션을 사용하게 되면 자동으로 등록을 수행합니다. 

 

추가로 @SpringBootApplication 내부에도 @ComponentScan기능을 가지고 있음으로써, boot server를 구동시 자동으로 Bean을 찾아서 관리를 해줍니다. 

 


# H2 DB 사용하기

해당 설정을 하는 과정에서 생각보다 까다로웠던게 많았던 것 같습니다. 기본적으로 강의에 알려주는 H2 설치 및 table 생성을 똑같이 해줍니다. 이후에 application.properties에 아래 값을 추가 해주어야 합니다. 

 

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa

 

기억은 나지 않는데, test.db를 찾지 못하는 오류가 발생하는 경우 다시 db를 삭제하고 생성한 후에 연결하는 작업을 수행하니 되었습니다. 기존에 잘 못 연결이 되면 다시는 연결이 안되는 듯 하더라구요. 그리고 한번 생성 한 후에는 db 서버를 절대 끄면 안됩니다. 


# DataSource

JDBC를 사용해본 경험이 있으시다면 금방 이해를 하실 수 있으실 텐데, dataSource를 사용함으로써 DB connection 객체를 손쉽게 획득 할 수 있습니다. 스프링 부트는 데이터베이스 컨넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어 두기 때문에 손쉽게 의존성 상태 주입을 받을 수 있습니다. 


# @Transactional

기본적으로 DB는 auto Commit 기능을 제공을 합니다. 하지만 테스트를 위한 데이터입력 및 삭제들은 기존 데이터를 변형을 일으켜 문제를 야기 할 수 있으므로 Transaction 기능을 활용하여 기존 데이터를 삭제 및 변형 하여도 다시 원형 데이터로 복원할 수 있습니다. 


# AOP

AOP는 Aspect Oriented Programming의 약자로 공통 관심사와 핵심 관심사를 구분하여 관리하는데에 유용한 프로그래밍 기술 입니다. 

Proxy 패턴은 대리자(Proxy) 객체를 이용하여 객체에 대한 접근을 제어하는 패턴입니다. 실제 객체의 동작을 대리자가 대신 처리하는 것으로, 실제 객체와 대리자 객체 사이에 중계 역할을 하는 객체를 두어 실제 객체를 보호하고 유연성을 높입니다.