본문 바로가기

STUDY/국비과정

[JAVA 웹 개발 공부] 국비지원 83일차 - 스프링 프레임 워크, MVC 핸들러, 핸들러 메소드, 모델, Logger, @Value, 의존객체 선택

스프링 MVC 핸들러

 

1. 핸들러(Handler)

MVC의 Controller 안에서 실제 요청을 처리하는 메소드를 핸들러(Handler)라고 한다. 사용자로부터 서버로 요청이 가면, 해당 요청에 맞는 컨트롤러의 핸들러로 요청 정보가 전해지고, 핸들러는 이를 처리하여 적절한 값을 반환 한다. 

그리고 요청과 핸들러를 연결하는 것을 핸들러 맵핑(Handller Mapping)이라고 하고, @RequestMapping 어노테이션을 사용하여 맵핑이 이루어지며, DispatcherServlet에게 리턴을 해줘서 응답을 할수있게 해준다.

 

2. @RequestMapping

*어노테이션 종류

어노테이션 설명
@RequestMapping - 클라이언트에게 요청받는 주소를 클래스와 연결시켜주는 어노테이션(클래스 연결 중간점)
- Controller 객체 안의 메서드와 클래스에 적용 가능
- Handler 메소드를 요청할 URL 경로 설정(value)
- Handler 메소드가 처리할 HTTP 요청 방식 설정(method)
- 응답/요청 Content Type 관련 설정(응답 : produces / 요청 : consumes)
@GetMapping RequestMapping(Method=RequestMethod.GET)과 똑같은 역할
@PostMapping RequestMapping(Method=RequestMethod.POST)과 똑같은 역할

*예제

@Controller
pulbic class SampleController {
	@RequestMapping("/hello")
	@ResponseBody
	public String hello() {
		return "hello.html";
	}
}

+) @ResponseBody

응답 바디에 담겨서 전달된다.

 

 

Handler 메소드

 

1. 리턴 타입

응답할 View나 응답 메세지와 관련한 값을 담아 리턴한다.

타입 설명
String View name 리턴(jsp를 이용하는 경우 jsp파일의 이름을 나타냄)
View를 호출할 때 View에게 전달할 값이 없거나 매개변수에서 ModelMap으로 처리한 경우 사용
ModelAndView View name과 View에게 전달할 값을 담아 리턴
View 응답을 처리하는 View객체를 직접 생성해서 리턴
DispatcherServlet은 ViewResolver를 사용하지 않고 리턴된 View를 이용해 응답
ResponseEntity HTTP 헤더 정보와 내용을 가공
HttpHeaders 응답에 내용없이 HTTP헤더 메세지만 전달하는 용도로 사용
모든 타입 @ResponseBody 어노테이션 선언
Handler 메소드가 리턴하는 값을 HTTP 응답 body에 넣어 바로 응답
Ajax 처리시 유용

 

2. 파라미터

요청 파라미터를 받기 위한 변수에 선언하는 어노테이션이다.

어노테이션 설명
@RequestBody HTTP 요청 body의 내용을 그대로 받는 변수 선언
JSON 형태로 받을 경우 사용(주로 AJAX 연동시)
@RequestParam default로 생략 가능
요청 파라미터 하나를 읽기 위한 변수 선언
@ModelAttribute object 타입으로 생략 가능
여러 개의 요청 파라미터를 VO에 넣어 받기 위한 변수 선언, 요청 파라미터 검증 가능

*예제

package kr.co.greenart.book;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class BookController {
	@Autowired
	private BookService service;

	@ModelAttribute("book")
	public Book defaultBook() {
		Book book = new Book();
		book.setTitle("기본값 제목");
		return book;
	}

	@GetMapping("/book")
	public String booklist(Model model) {
		model.addAttribute("name", service.getAll());
		return "booklist";
	}

	@GetMapping("/book/add")
	public String bookadd(@ModelAttribute("book") Book book) {
		return "bookform";
	}

	@PostMapping("/book/add")
	public String bookaddpost(@ModelAttribute("book") @Valid Book book, Errors errors) {
		if (errors.hasErrors()) {
			return "bookform";
		}
		service.insert(book);
		return "redirect:/";
	}
}

 

 

모델(Model)

 

Model은 HashMap 형태를 갖고 있으며, key와 value값을 가지고 있다.

또한, addAttribute()와 같은 기능을 통해 모델에 원하는 속성과 그것에 대한 값을 주어 전달할 뷰에 데이터를 전달할 수 있다.

스프링에서 Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있으며, Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 한다. 이를 이용해서 JSP와 같은 뷰로 전달해야 하는 데이터를 담아서 보낼 수 있다. 메서드의 파라미터에 Model 타입이 지정된 경우에는 스프링은 특별하게 Model 타입의 객체를 만들어서 메서드에 주입하게 된다.

 

 

Logger 사용

 

1. pom.xml에 <dependencies> 태그 안에 dependency를 추가

SLF4J API Module 
» 
2.0.6
logger 인터페이스 <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.6</version>
</dependency>
Logback Classic Module
» 1.3.5
logger slf4j 구현체 <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.3.5</version>
</dependency>

 

2. logger 사용

package kr.co.greenart.index;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class SampleController {
	private static final Logger logger = LoggerFactory.getLogger(SampleController.class);
	
	@RequestMapping(value = { "/", "/sample.jsp" }, method = RequestMethod.GET)
	public String index() {
		logger.info("사용자가 sample 페이지를 요청하였습니다");
		return "sample";
	}
}

 

 

@Value

 

properties 파일을 생성 후 @Value 어노테이션을 통해 값을 가져와서 사용할 수 있다.

 

*datasource.properties

mysql.driverClassName=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/my_db
mysql.userName=root
mysql.password=root

 

*RootConfig.java

package kr.co.greenart.config;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.JdbcTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@EnableAspectJAutoProxy
@PropertySource("classpath:/kr/co/greenart/config/datasource.properties")
public class RootConfig {
	@Value("${mysql.driverClassName}")
	private String driverClassName;
	@Value("${mysql.url}")
	private String url;
	@Value("${mysql.userName}")
	private String userName;
	@Value("${mysql.password}")
	private String password;

	@Bean
	public DataSource dataSource() {
		BasicDataSource ds = new BasicDataSource();
		ds.setDriverClassName(driverClassName);
		ds.setUrl(url);
		ds.setUsername(userName);
		ds.setPassword(password);

		return ds;
	}

	@Bean
	@Autowired
	public JdbcTemplate jdbcTemplate(DataSource dataSource) {
		return new JdbcTemplate(dataSource);
	}
	
	@Bean
	@Autowired
	public PlatformTransactionManager txManager(DataSource dataSource) {
		JdbcTransactionManager txManager = new JdbcTransactionManager(dataSource);
		return txManager;
	}
}

 

 

스프링 의존객체 선택

 

@Autowired, @Resource, @Inject 어노테이션으로만 자동적으로 객체를 주입할 경우 컨테이너에서 주입할 대상이 여러개여서 의존성을 주입하지 못하는 경우가 발생할 수 있다.
이 때, @Qualifier@Named 어노테이션을 써서 하나의 의존객체를 선택하여 객체 간 선택적 충돌이 발생하지 않게 할 수 있다.

또한, @Primary 어노테이션을 통해 여러개의 구현체들 중 우선순위를 갖는 빈을 지정할 수 있다.