우리는 지난번까지 HttpServlet 클래스를 사용하여 명령어를 web.xml 파일에 등록하고 사용하는 방법에 대해 배웠다.
스프링에서는 그렇게 하지 않고 자바의 클래스 파일로 명령어를 구현하여 명령어 처리를 가능하게 한다.
그 때 사용하는 것이 바로 어노테이션(@)이다.
1. 스프링에서 사용하는 어노테이션
1) @Controller
- 해당 클래스가 Controller임을 나타내기 위한 어노테이션
- 접속자의 URL 요청을 처리하는 클래스라는 정의.
package kr.co.itwill;
import org.springframework.stereotype.Controller;
// URL에서 요청한 명령어를 읽어서 처리해주는 클래스로 지정
// web.xml 에 ~~~.do 와 같은 명령어를 입력하지 말고 클래스로 구현을 하는 것
// HelloController 클래스는 컨트롤러 기능을 한다.
// 스프링 컨테이너(웹서버)가 자동으로 객체를 생성한다.
@Controller
public class HelloController {
public HelloController() {
System.out.println("----HelloController() 객체 생성됨");
} // end
// 결과확인 http://localhost:9095/hello.do
// 요청 명령어 등록 후 실행의 주체는 메서드(함수)
} // class end
이 상태로 자동으로 생성되어있는 사용자이름+Application.java 파일을 Run As > Spring Boot App 으로 실행시킨다.
객체가 생성되는 것을 확인할 수 있다(현재 톰캣 서버가 충돌한 상태여서 오류가 난 상황이다).
신기하지 않은가.
@Controller만 붙였다고 객체가 저절로 생성되다니!
이는 다음에 알아볼 스프링 컨테이너에 대한 이해가 필요하다.
다음은 명령어를 등록해보자.
2) @RequestMapping
- 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션
- 접속자의 요청주소에 따라 실행할 클래스나 메소드의 구분자로 사용.
@RequestMapping("/hello.do")
public void hello() {
} // hello() end
이제 뷰페이지를 구성할 것인데 여기서 JSP 형태로 뷰페이지를 구성하기 위해선 의존성 추가가 필요하다.
https://mvnrepository.com/search?q=jasper
위 링클르 클릭한 후 Tomcat Embed Jasper(내장형 톰캣버전 Jasper)를 타고 들어가서 의존성을 추가해준다.
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.58</version>
</dependency>
(9 버전 대 중 가장 높은 다운로드율을 보이는 버전을 추가해주었다)
3) @RequestParam
- Controller 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션
- <FORM>태그에서 전송한 데이터의 접근
4) @ModelAttribute
- Controller 메소드의 파라미터나 리턴값을 Model 객체와 바인딩하기 위한 어노테이션
5) @SessionAttributes
- Model 객체를 세션에 저장하고 사용하기 위한 어노테이션
- @Component : Spring이 필요시 자동으로 객체를 생성함. Spring 컨테이너가 객체를 만들도록 권한을 부여, 범용적인 Bean
- @Autowired : Spring이 필요시 자동으로 객체를 생성하여 필드(Instance variable, 객체 변수)에 할당함, @Component 선언에 따라 자동으로 만들어진 객체를 연결하는 어노테이션
- @Qualifier("타입이 맞은 빈 객체 이름") : 지시자를 통해 빈 객체 지명 가능, 같은 이름의 클래스가 존재하면 생성되는 클래스에 이름을 부여하고 구분해서 객체를 할당 받음.
- @Repository : DAO를 스프링에 인식시키기 위해서 주로 사용, 모델클래스로 지정하면 스프링컨테이너에서 관리를 해줌, 여기 경로 안에 @Repository를 달고 있으면 인식을 해주고 그것을 객체로 만들어 준다, DAO관련 빈을 자동 등록 대상으로 만들때 사용한다, @Component를 부여해도 되지만, 스프링에서는 @Repository를 권장한다, @Component와 차이점은 Exception이 발생했을 때, DB Exception을 DataAccessException을 변환한다. 같은 클래스가 다른 패키지에 존재하면 이름을 할당하여 구분해야 한다.
- @ResponseBody : jsp view를 이용하여 출력하지 않고 response 객체에 직접 출력한다. JSON형식의 출력값.
- @RequestBody : JSON형식의 입력변수.
- @Inject : 사용자가 직접 만들지 않고 스프링에서 생성해서 주입을 시킴.
- @RestController : 컨트롤러(json을 리턴할 경우).
- @Service : 로직처리.
- @RequestMapping : URL mapping.
- @RequestParam : get/post방식으로 전달되는 매개변수(개별변수).
- @ModelAttribute : get/post방식으로 전달되는 매개변수(클래스타입).
- @PathVariable : URL에 포함된 변수.
2. 스프링 컨테이너
참조 : https://mslilsunshine.tistory.com/148
ApplicationContext AC=new AnnotationConfigApplicationContext(AppConfig.class);
//자동으로 AppConfig의 bean들을 spring container에 넣어서 관리해줌
//스프링 ApplicationContext를 통해 찾아와야함
- ApplicationContext를 스프링 컨테이너라고 하며, 이는 인터페이스이다.
: 스프링 컨테이너는 XML로도, 애노테이션 기반의 자바 설정 클래스로도 만들 수 있으며 현재는 후자가 더 많이 사용된다.
- new AnnotationConfigApplicationContext(AppConfig.class) 은 위의 ApplicationContext 인터페이스의 구현체이다.
1) 스프링 컨테이너의 생성과정
: 스프링 컨테이너를 생성할 때는 구성 정보를 지정해야 하며, 이는 AppConfig.class로 지정되었다.
-> AppConfig 내에서 @Configuration 어노테이션을 통해 스프링 컨테이너에 자동 등록될 구성 정보가 만들어진 바 있다.
2) 스프링 빈 등록
: 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해 스프링 빈을 컨테이너에 등록한다.
- 빈 이름은 기본적으로 메소드 이름을 사용하나, @Bean(name="memberSerivce2")와 같이 직접 부여 가능
- 빈 이름은 항상 다른 이름을 부여해야 한다. 아니면 오류 또는 다른 빈을 무시하는 일이 생긴다.
3) 스프링 빈 의존관계 설정
: 구성 정보를 참고하여 의존관계를 주입하며, 어떤 구현체가 들어가는지는 getter를 통해 결정해주면 된다.
1) memberService에 사용될 repository는 아래의 memberRepository 객체를 참조한다.
2) orderService에 사용될 Policy와 Repository는 아래의 memberRepository와 discountPolicy 객체를 참조한다.
-> 각각의 인터페이스에 어떤 구현체가 들어올지는 런타임에 결정되며, 이때 외부에서 실제 구현 객체가 생성되어 클라이언트에 주입된다.
이와 같은 과정으로 자동적으로 스프링이 객체를 생성해준다.
3. 스프링 apllication.properties 환경설정하기
스프링 부트로 넘어오면서 이전보다 더 손쉽게 필요한 공통 환경을 설정해줄 수 있다.
위 사진의 경로에서 application.properties에 공통 사항을 적어주면 환경을 설정할 수 있다.
이 때 주석 기호는 #이다.
# 주석
# src/main/resources/application.properties 환경설정 파일
# Spring Boot는 WAS(Tomcat) 내장되어있음(기본 port 번호 8080)
# 톰캣 서버의 http port 번호 변경
server.port=9095
이렇게 포트번호를 변경하면 스프링에서 포트번호를 변경한 것을 확인할 수 있다.
이 후 JSP를 뷰페이지로 사용할 경우에는 pom.xml에 라이브러리를 추가해야하고 환경설정에도 추가해주어야 한다.
# 주의사항 JSP, Thymeleaf, Mustache는 공동으로 사용될 수 없음.
# JSP를 뷰페이지로 사용할 경우 pom.xml에 라이브러리를 추가해주어야 한다(위에서 했다).
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
코드를 뜯어보면 스프링에서 MVC 패턴으로 뷰단에 연결할 파일들은 WEB-INF 안의 views 라는 폴더들에 들어있고, 파일의 형식은 .jsp 라는 뜻이다.
(폴더는 직접 생성해주었다. 이렇게 여러 경로로 만들 시 보안이 강화되기도 하고 많은 개발자들이 이러한 루트를 사용하여 view단을 구성한다)
이제 DispatverServlet을 활용하여 View와 Model을 컨트롤러로 연결시켜주려한다.
이 DispatverServlet의 주요한 요소들은 아래와 같다.
DispatcherServlet | Spring MVC Framework의 Front Controller, 웹요청과 응답의 Life Cycle을 주관한다. |
HandlerMapping | 웹요청시 해당 URL을 어떤 Controller가 처리할지 결정한다. |
Controller | 비지니스 로직을 수행하고 결과 데이터를 ModelAndView에 반영한다. |
ModelAndView | Controller가 수행 결과를 반영하는 Model 데이터 객체와 이동할 페이지 정보(또는 View객체)로 이루어져 있다. |
ViewResolver | 어떤 View를 선택할지 결정한다. |
View | 결과 데이터인 Model 객체를 display한다. |
우선 먼저 JSP 파일을 만들었다.
그리고 우리는 위에서 컨트롤러로 선언한 HelloController.java 파일을 사용하여서 활용시킬 것이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hello.jsp</title>
</head>
<body>
<h3>안녕하세요~~</h3>
</body>
</html>
이제 자바 파일에서 이 페이지를 불러오는 명령어를 등록시켜보자.
여기서 사용할 객체는 바로 ModelAndView 이며 @RequestMapping 이라는 어노테이션을 활용할 예정이다.
@RequestMapping("/hello.do")
public ModelAndView hello() {
ModelAndView mav = new ModelAndView();
// application.properties 환경 설정 파일의 prefix와 suffix 값을 조합해서 뷰페이지를 완성시킨다.
// /WEB-INF/views/hello.jsp
mav.setViewName("hello");
return mav;
} // hello() end
이제 포트번호인 9095를 활용하여서 hello.do 명령어를 실행시켜보자.
http://localhost:9095/hello.do을 입력하면 아래와 같은 화면이 출력된다.
+ 여기서 다른 페이지에 값을 넘겨주고 싶을 때가 있다.
그럴 땐 우리가 흔히 써왔던 request.getAttribute() 와 동일한 기능을 하는 메서드가 있다.
바로 addObject라는 함수.
// 서로 다른 페이지들 간의 값을 공유하기 위해서
// -> request, session, application 활용
// request.setAttribute() 함수와 동일
mav.addObject("message", "Welcome to MyHome");
이렇게 작성한 뒤 자식 페이지인 hello.jsp에서 값을 불러온 뒤 실행시키면 아래와 같은 값을 얻을 수 있다.
<h3>안녕하세요~~</h3>
${requestScope.message}
<br>
${message}
'⁂ Spring FrameWork > : 기본 익히기(Boot 기반)' 카테고리의 다른 글
[Spring] #6-2 컨트롤러로 게시판 만들기 (0) | 2022.11.01 |
---|---|
[Spring] #6 View와 Controller 연습하기(MVC 중 VC) (0) | 2022.11.01 |
[Spring] #4 pom.xml 뜯어보기 (0) | 2022.10.31 |
[Spring] #3 프로젝트 만들기(Maven) (0) | 2022.10.31 |
[Spring] #2 스프링 프레임워크의 특징 (1) | 2022.10.31 |