개발자의 길

[Java][SpringBoot] "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 강의노트

토아드 2021. 12. 22. 18:19
반응형

스프링 웹 개발 기초 - 웹 화면을 Client 에 전달하는 방법

 stsatic/index.html 을 올려두면 가장 첫 화면으로 등록된다 - Welcome page 기능.

 @Controller 로 등록된 class 에서 @GetMapping 으로 등록된 함수가 string 을 리턴할 때, 스프링에서 viewResolver 라는 녀석이 resources::templates/ 에서 리턴한 string 에 해당하는 html 파일을 웹 화면에 띄워준다.

 

정적 컨텐츠

resources::static 에 hello-static.html 이라는 html 파일이 있고, 웹에서 http://address/hello-static.html 이라는 주소로 요청을 했다 지차.

 이 경우에 hello-static 과 연관된 Controller 가 없으면(@GetMapping 으로 등록된 함수를 가진 Controller 가 없으면), 스프링은 resources::static/hello-static.html 파일을 웹 화면에 띄워준다. 이 경우 이것을 정적 컨텐츠라고 부른다.

 

MVC와 템플릿 엔진

MVC 는 Model, View, Controller 의 약자로, 웹개발에 자주 쓰이는 디자인 패턴을 말한다. 간단히 말하자면 View 는 웹 화면에 보이는 화면, Model 은 웹 화면에 실을 데이터의 형태, Controller 는 View 와 Model 을 어떤식으로 띄워줄지 결정하는 역할을 가진다.

 위 정적 컨텐츠와 같이 웹에서 http://address/hello-static.html 라는 요청을 보냈다고 하자, 스프링 컨테이너 내부에서는 먼저 @Getmapping 으로 "hello-static" 이 등록된 함수가 있는지 확인한다. 만약에 있다면, 해당 함수를 호출하여 파라미터를 넘겨주고, Model 에 값을 세팅하는 등의 작업을 거친 후 함수로부터 string 값을 리턴 받는다. 

 이때 리턴받은 string 값에 해당하는 웹 페이지를 찾기위해 viewResolver 라는 모듈에게 string 값을 전달하면, viewResolver 는 templates/"string".html 에 해당하는 웹 페이지를 찾아서 controller 로 부터 전달받은 Model 값을 이용해 동적으로 웹 페이지를 생성하여 클라이언트의 화면에 보여준다. 이때 웹 페이지를 동적으로 생성해주는 역할을 템플릿 엔진이 처리한다 ( 해당 강의에서는 Thymeleaf 를 템플릿 엔진으로 사용한다 ) 

 

API

@Getmapping 으로 매핑된 함수에 @ResponseBody 어노테이션을 추가하면 viewResolver 를 사용하지 않고, HTTP 의 BODY 에 문자 내용을 직접 반환한다.

string 을 리턴할 경우 헤당 string 을 직접 리턴하기도 하지만, 객체를 반환할 경우 httpMessageConverter 가 객체를 문자열로 반환해준다. 객체로 반환할 경우 default 로는 JSON convert 가 동작하여 JSON 형태로 변환하여 반환해 준다.

 

스프링 빈과 의존관계

Spring Bean 이란, Spring과 관련된 객체를 관리하는 스프링 컨테이너인 Spring Ioc 가 관리하는 객체를 의미한다. Spring Bean 으로 등록하기 위해서는 컴포넌트 스캔 방식과 코드로 직접 스프링 빈에 등록하는 방법이 있다.

 

컴포넌트 스캔과 자동 의존관계 설정

클래스에 어노테이션으로 @Controller, @Service, @Repository 를 추가하거나, @Component 어노테이션을 추가해 주면 자동으로 스프링 빈에 등록된다. 

스프링 빈으로 등록된 클래스의 생성자에 @Autowired 를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 생성자의 파라미터에 해당하는 스프링 빈을 찾아서 주입하게 된다. 생성자가 한개만 있다면 해당 어노테이션은 생략 가능하다.

 

자바 코드로 직접 스프링 빈 등록하기

컴포넌트 스캔을 지원하는 위의 어노테이션들을 제거하고, 특정 클래스에 @Configuration 을 추가한 다음, 해당 클래스 내에 객체를 리턴하는 함수를 생성하여 @Bean 을 추가해두면 스프링 빈에 등록이 된다. 이런 방식으로 설정할 경우 향후에 의존성 주입을 실시할 객체가 달라질 경우 해당 코드만 변경 가능하다는 장점이 있다.

 

스프링 DB 접근 기술

순수 JDBC : 순수 JDBC 라이브러리를 활용해서 접근하는 방식으로, 직접 DB 연결을 수행하고 statement 를 준비하고 이것을 닫는 작업까지 직접 해 주는 것을 의미한다. 내 입장에서는 C에서 사용하던 SQLite3 와 비슷한 사용방식 이다.

스프링 JdbcTemplate : 순수 JDBC 를 사용할 때 반복되는 코드를 일부 제거해준다는 장점이 있다. 하지만 SQL 은 직접 생성하여 수행하게 된다.

JPA : 기존의 반복 코드도 제거하고, SQL 도 JPA 가 직접 만들어서 실행할 수 있다. 객체 중심의 설계로 패러다임을 전환 할 수 있고, 개발 생산성을 높일 수 있다. 클래스에 @Entity 어노테이션을 추가함으로써 class 를 Table 데이터로 자동으로 변환 할 수 있으며, 순수 SQL 이 아닌 JPA 에서 지원하는 객체지향적인 Query 를 생성하여 사용할 수 도 있다.

스프링 데이터 JPA : interface 를 정의하기만 하여도 자동으로 테이블 생성부터 데이터 수정까지 할 수 있도록 해주는 기능이다. 개발 생산성이 매우 올라간다. JPA 를 먼저 학습한뒤 배워서 응용하자.

 

AOP ( Aspect Oriented Programing )

모든 메소드의 호출 시간을 측정하고 싶다면? 직접 tick count 를 계산하는 방법이 떠오른다. 그런데 이런 방법은 유지보수가 거의 노가다 수준으로 어렵고 시간 낭비가 크다. 이런 것을 해결해 주는것이 AOP 로써, AOP 클래스를 구현하여서 특정 패키지 경로를 등록해 두면 해당 경로 내의 패키지에 대한 클래스들의 메서드가 수행될 때 AOP 클래스의 주요기능이 항상 호출되도록 한다.

 내부적으로는 AOP 클래스에서 ProceedingJointPoint.proceed() 함수를 이용해 AOP 를 적용시키려는 함수의 메서드를 호출하는 방식으로 구현되어 있다고 한다.

 

반응형