김갱환
맨땅에 코딩
김갱환
전체 방문자
오늘
어제
  • 분류 전체보기 (239)
    • ⁂ 맨땅에 코딩 (11)
      • : Story (3)
      • : MiniProject 'MyWeb' (1)
      • : Final Project (5)
      • : Josa-Moa 한국어 조사 처리 프로젝트 (1)
    • —————Frontend——————————————.. (0)
    • ⁂ HTML (10)
      • : 기본 익히기 (10)
    • ⁂ CSS (15)
      • : 기본 익히기 (15)
    • ⁂ Java Script (32)
      • : 기본 익히기 (28)
      • : 자바스크립트 라이브러리 (1)
      • : 연습 문제 (3)
    • ⁂ jQuery (11)
      • : 기본 익히기 (11)
    • ⁂ Bootstrap (3)
      • : 기본 익히기 (3)
    • ⁂ TailWind CSS (1)
    • ⁂ AJAX (5)
      • : 기본 익히기 (5)
    • ⁂ Vue.js (3)
      • : 기본 익히기 (3)
    • —————DB : Data Base————————.. (0)
    • ⁂ Oracle DB (27)
      • : 기본 익히기 (24)
      • : 연습 문제 (3)
    • ⁂ MyBatis Framework (15)
      • : 기본 익히기 (15)
    • —————Backend———————————————.. (0)
    • ⁂ Java (62)
      • : 기본 익히기 (42)
      • : JDBC - Java DataBase Conn.. (4)
      • : Crawling (2)
      • : 독학으로 공부하기(과거) (11)
      • : 연습문제 (3)
    • ——————Web————————————————— (0)
    • ⁂ JSP (28)
      • : 기본 익히기 (28)
    • ⁂ Spring FrameWork (15)
      • : Legacy Project (1)
      • : 기본 익히기(Boot 기반) (14)
    • ——————————————————————— (0)
    • ⁂ Error Note (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • httperror
  • 개발자
  • 코딩 #코딩공부 #상수 #리터럴 #형변환 #개발자 #자바 #자바공부 #자바독학
  • web.xml수정
  • 풀스택
  • 코딩공부 #코딩 #자바 #자바독학 #자바공부 #개발자 #프론트앤드 #백앤드 #풀스택
  • 자바공부
  • 비트연산자 #코딩공부 #자바공부 #코딩 #자바 #프로그래밍 #개발자
  • 백앤드
  • http에러메세지
  • 객체지향프로그래밍
  • 코딩공부
  • 연산자 #기본연산자 #코딩 #자바 #독학 #자바공부 #자바연산자
  • 코딩 #코딩공부 #프론트앤드 #백앤드 #풀스택개발자
  • 프론트앤드
  • ErrorPage
  • HTML공부
  • 코딩
  • 코딩공부 #자바공부
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김갱환

맨땅에 코딩

⁂ Spring FrameWork/: 기본 익히기(Boot 기반)

[Spring] #5 어노테이션과 스프링 컨테이너(+ 내장형 톰캣 환경설정하기)

2022. 10. 31. 16:58

우리는 지난번까지 HttpServlet 클래스를 사용하여 명령어를 web.xml 파일에 등록하고 사용하는 방법에 대해 배웠다.

스프링에서는 그렇게 하지 않고 자바의 클래스 파일로 명령어를 구현하여 명령어 처리를 가능하게 한다.

그 때 사용하는 것이 바로 어노테이션(@)이다.

 

egovframework:rte2:ptl:annotation-based_controller [eGovFrame]

작업중입니다… ControllerAdvice추가예정 스프링 프레임워크는 2.5 버젼 부터 Java 5+ 이상이면 @Controller(Annotation-based Controller)를 개발할 수 있는 환경을 제공한다. 인터페이스 Controller를 구현한 SimpleFo

www.egovframe.go.kr

 

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

 

Spring 핵심 원리 #6- 스프링 컨테이너 생성과 등록된 빈 조회

# 스프링 컨테이너 ApplicationContext AC=new AnnotationConfigApplicationContext(AppConfig.class); //자동으로 AppConfig의 bean들을 spring container에 넣어서 관리해줌 //스프링 ApplicationContext를 통해..

mslilsunshine.tistory.com

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

 

 이렇게 포트번호를 변경하면 스프링에서 포트번호를 변경한 것을 확인할 수 있다.

포트 번호가 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을 입력하면 아래와 같은 화면이 출력된다.

hello.do 명령어를 통해 JSP파일이 출력되었다

 

 + 여기서 다른 페이지에 값을 넘겨주고 싶을 때가 있다.

 그럴 땐 우리가 흔히 써왔던 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
    '⁂ Spring FrameWork/: 기본 익히기(Boot 기반)' 카테고리의 다른 글
    • [Spring] #6-2 컨트롤러로 게시판 만들기
    • [Spring] #6 View와 Controller 연습하기(MVC 중 VC)
    • [Spring] #4 pom.xml 뜯어보기
    • [Spring] #3 프로젝트 만들기(Maven)
    김갱환
    김갱환
    코딩의 코자도 모르는 이의 공부 기록장

    티스토리툴바