[SIST] Srping_days04_Spring MVC

2022. 7. 14. 23:28·TIL/Spring
728x90
반응형

days03 수업은 xml 설정 파일로 빈 객체를 생성 + 조립하고 요청URL에 해당하는 컨트롤러를 검색하였다.

오늘은 컴포넌트 스캔 기능 + 애노테이션으로 매핑 처리를 해주고 어떤 클래스가 컨트롤러이고 DAO인지 설정을 해주었다.

 

처음에 다룰 예제는 컴포넌트 스캔 기능 + @RequestMapping 애노테이션으로 매핑 처리 + 각 클래스에 애노테이션으로 컨트롤러(@Controller)와 DAO(@Repository)인지 선언. 즉, 하나의 기능마다 컨트롤러를 생성하는 것(@Component 애노테이션을 사용해도 되지만 더욱 직관적으로 판단할 수 있도록 각 기능에 맞는 애노테이션을 준다.)

 

그 다음으로 다룰 예제는 컴포넌트 스캔 기능 + @RequestMapping 애노테이션으로 매핑 처리 + 어떠한 특정 테이블과 관련된 클래스를 만들어서 그 안에 컨트롤러 메서드 선언. 즉, 기능마다 별도의 컨트롤러를 생성하는 것이 아니라 하나의 클래스에 컨트롤러 메서드를 선언하는 예제를 다룰 것이다.


1. 예제 1번

1) 컴포넌트 스캔 기능을 사용하기 위해서 dispatcher-servlet.xml에 <context:component-scan base-package="패키지명"> 태그로 설정을 해준다.

 

Controller와 DAO가 해당 패키지에 있기 때문에 아래와 같이 패키지명을 주었다.

 

2) DAO와 컨트롤러에 애노테이션 선언

- Controller 클래스에는 @Controller 애노테이션을 DAO 클래스에는 @Repository 애노테이션을 선언

(@Component 애노테이션을 줄 수 있지만 해당 클래스가 어떤 기능을 하는지 직관적으로 볼 수 있도록 기능에 맞는 애노테이션을 줌)

 

- DI(의존 주입)을 해야하는 Controller 클래스에는 필드, 생성자, 프로퍼티 설정(setter)에 @Autowired 애노테이션 선언

 

이 상태로 notice.htm 파일을 실행시키면 HTTP 상태 404 에러가 발생한다.

그 이유는 무엇일까?

우리가 days03 수업했을 때는 dispatcher-servlet.xml 파일에서 <bean> 태그의 name 속성으로 요청URL과 매칭이 되는 Controller를 설정해 주었는데 현재 xml 파일에는 요청URL과 매칭이 되는 Controller를 찾을 수 없기 때문이다.

 

그렇다면 어떻게 요청URL과 매칭이 되는 Controller을 찾을 수 있게 설정할 수 있을까?

바로 @RequestMapping 애노테이션을 사용하여 요청URL을 설정해주면 해당 요청URL이 들어오면 애노테이션을 준 Controller을 찾을 수 있다.

 

[NoticeDao]

 

> Controller 클래스들은 디폴트 생성자, 생성자, get/set이 있는데 생략하여 이미지를 첨부하였다.

[NoticeController]

- /customer/notice.htm 요청URL이 들어오면 NoticeController와 매칭

- Controller 인터페이스를 구현했기 때문에 @Controller 애노테이션을 설정하면 인터페이스와 충돌이 나기 때문에 패키지명까지 풀네임이 들어가진다.

 

[NoticeDetailController]

- /customer/noticeDetail.htm 요청URL이 들어오면 NoticeDetailController와 매칭

- Controller 인터페이스를 구현했기 때문에 @Controller 애노테이션을 설정하면 인터페이스와 충돌이 나기 때문에 패키지명까지 풀네임이 들어가진다.


1. 예제 2번

예제 2번을 다루기 앞서 예제 1번의 단점 또는 문제점을 먼저 파악해보자.

 

1번 예제에서는 Controller가 고작 2개 밖에 없지만 만약 실제로 프로젝트를 만든다면 당연히 여러 개의 요청URL과 그 요청URL에 매칭이 되는 Controller를 생성해야 될 것이다. 하나의 기능별로 Controller를 만들어야 한다는 말! (최근 JSP/Servlet MVC 패턴으로 프로젝트 했을 때도 엄청 많이 만들었다..^^)

 

이런 번거로움을 없애기 위해서 하나의 공통된 Controller 안에 컨트롤러 메서드를 생성하여 처리하면 작업이 훨씬 더 편리해진다.

 

이제 예제를 살펴보자


1) 컴포넌트 스캔 기능을 사용하기 위해서 dispatcher-servlet.xml에 <context:component-scan base-package="패키지명"> 태그로 설정을 해준다.

 

Controller와 DAO가 해당 패키지에 있기 때문에 아래와 같이 패키지명을 주었다.

 

2) NoticeDao 클래스에는 @Repository 애노테이션 설정

 

3) 기존의 NoticeController와 NoticeDetailController는 삭제하고 CustomerController 라는 컨트롤러 클래스를 생성

기존의 NoticeController와 NoticeDetailController의 요청URL을 보면 /customer이 공통적으로 들어가있다.

공통적인 경로는 Controller에 @RequestMapping 애노테이션으로 설정해주고 상세한 요청URL에 해당하는 컨트롤러 메서드에 @RequestMapping 애노테이션으로 설정해주면된다.(ex. notice.htm이나 noticeDetail.htm 등)

 

> 각 컨트롤러 메서드를 다양한 방법으로 구현하여 여러 개의 예시를 정리하였다.

[CustomerController]

 

[공지사항 상세보기하는 컨트롤러 메서드 - noticeDetail]

1) @RequestMapping 애노테이션으로 value 속성 값을 사용하여 요청URL 설정 + ModelAndView 객체 사용

 

2) @RequestMapping 애노테이션으로 value 속성 값을 사용하여 요청URL 설정 + 컨트롤러 메서드의 파라미터 타입과 리턴 타입 사용

> Model 파라미터를 사용하면 addAttribute 메서드를 사용하여 넘겨준다.

 

* 컨트롤러 메서드의 파라미터 타입과 리턴 타입

출처 : 웹 개발자를 위한 Spring 4.0


[공지사항 목록을 가져오는 메서드 - notice]

1) @RequestMapping 애노테이션으로 value 속성 값을 사용하여 요청URL 설정 + ModelAndView 객체 사용

 

2) @RequestMapping 애노테이션으로 value 속성 값을 사용하여 요청URL 설정 + 컨트롤러 메서드의 파라미터 타입 사용 + ModelAndView 객체 사용

> 넘겨져오는 파라미터 이름과 동일한 매개변수를 주면 자동으로 가져온다.

 

3) @RequestMapping 애노테이션으로 value 속성 값을 사용하여 요청URL 설정 + 컨트롤러 메서드의 리턴타입 사용 + @RequestParam 애노테이션으로 넘겨져오는 값을 원하는 변수명에 담고 기본 값을 설정

> @RequestParam(value="파라미터이름", defaultValue="넘어오지 않을 경우 지정할 기본값") 자료형 변수명   => 자료형을 바꾸면 자동으로 파싱

> Model 파라미터를 사용하면 addAttribute 메서드를 사용하여 넘겨준다.


[공지사항 쓰기 메서드 - noticeRef] = 스프링에서의 GET 방식과 POST 방식 처리

GET 방식으로 요청하면 포워딩으로 공지사항을 쓸 수 있는 페이지를 보여주고 글을 쓴 뒤에 저장을 누르면 POST 방식으로 요청이와 리다이렉트를 해줄 것이다.

 

이제 GET 방식 요청과 POST 방식의 요청을 구분해서 포워딩을 할지 리다이렉트를 할지 구현을 해야하는데 아래처럼 if 조건문으로 분기를 해서 나눌 수도 있지만

@RequestMapping 애노테이션을 사용하여 method 속성으로 요청 방식을 설정할 수 있다.

 

1) noticeReg.htm 요청이 GET 방식으로 요청을 하면 해당 컨트롤러 메서드 실행 + String 리턴 타입 사용

> @RequestMapping 애노테이션에 value={"요청URL"}을 설정해주고 ,(콤마) 구분으로 method 속성에 RequestMethod.GET 설정

 

2-1) noticeReg.htm 요청이 POST 방식으로 요청을 하면 해당 컨트롤러 메서드 실행 + String 파라미터 / 리턴 타입 사용

> @RequestMapping 애노테이션에 value={"요청URL"}을 설정해주고 ,(콤마) 구분으로 method 속성에 RequestMethod.POST 설정

> 스프링에서 리다이렉트를 하기 위해서는 redirect: 접두어를 붙인다.

 

2-2) noticeReg.htm 요청이 POST 방식으로 요청을 하면 해당 컨트롤러 메서드 실행 + 커맨드 객체를 파라미터 사용 + String 리턴 타입 사용

> 커맨드 객체를 파라미터로 사용하면 자동으로 해당 객체가 DAO 메서드에 적용되어진다.


[공지사항 수정 메서드 - noticeEdit] = 스프링에서의 GET 방식과 POST 방식 처리


[공지사항 삭제 메서드 - noticeDel]


[오늘 수업 정리]

- 컴포넌트 스캔으로 자동 빈 객체 생성 + 조립할 시!

@Component 애노테이션으로 설정할 수 있지만

Controller에는 @Controller 애노테이션 주기

DAO에는 @Repository 애노테이션 주기

 

- 요청URL에 공통적인 경로가 있다면 Controller 클래스에 @RequestMapping 애노테이션으로 공통 경로 설정

ex. @RequestMapping("/customer/*")

 

- 동일한 요청URL로 요청 방식이 GET과 POST 2개가 존재한다면

@RequestMapping 애노테이션에 value 속성으로 요청URL 설정

method 속성으로 요청 방식 설정

ex. @RequestMapping(value = {"noticeEdit.htm"}, method = RequestMethod.POST)

 

- 넘겨져오는 파라미터 이름과 동일한 변수로 지정하면 자동으로 가져옴

만약, 다른 변수명에 지정하고 싶다면 @RequestParam 애노테이션을 사용

@RequestParam(value="파라미터name") 자료형 변수명

여기서 자료형을 바꿔서 지정해주면 자동으로 파싱이 되어진다.

만약, 넘겨져오는 파라미터 값이 없어서 기본 값을 설정해 주고 싶다면 @RequestParam 애노테이션으로 defaultValue 속성으로 설정

ex. @RequestParam(value="page", defaultValue = "1") int ppage 

 

- 파라미터를 커맨드 객체를 사용하면 자동으로 객체로 DAO 메서드에 매개변수로 들어가지면서 DAO 메서드에 필요한 값들로 자동 설정되어진다.

 

 

728x90
반응형

'TIL > Spring' 카테고리의 다른 글

[SIST] Spring_days05_Spring의 DB 연동(Spring JDBC) / JdbcTemplate  (0) 2022.07.17
[SIST] Spring_days05_Spring 파일 업로드  (0) 2022.07.16
[SIST] Spring_days03_Spring MVC  (0) 2022.07.13
[SIST] Spring_days03_@Aspect 애노테이션 기반 AOP 구현  (0) 2022.07.13
[SIST] Spring_days02_스프링 AOP와 스프링 API / XML 스키마 기반으로 AOP 구현  (0) 2022.07.13
'TIL/Spring' 카테고리의 다른 글
  • [SIST] Spring_days05_Spring의 DB 연동(Spring JDBC) / JdbcTemplate
  • [SIST] Spring_days05_Spring 파일 업로드
  • [SIST] Spring_days03_Spring MVC
  • [SIST] Spring_days03_@Aspect 애노테이션 기반 AOP 구현
야리니
야리니
오늘보다 내일 더 성장하는 개발자가 되기 위한 야리니 블로그입니다 :)
    반응형
    250x250
  • 야리니
    야리니의 step by step
    야리니
  • 링크

    • GitHub
    • Linkedin
  • 전체
    오늘
    어제
    • 분류 전체보기 (477)
      • TIL (379)
        • Java (97)
        • Kotlin (28)
        • JPA (16)
        • Spring (37)
        • Oracle (22)
        • JDBC (7)
        • Web(HTML, CSS, JS, jQuery) (90)
        • View Template (31)
        • AWS (7)
        • HTTP (7)
        • CS (5)
        • Linux, Unix (2)
        • Python (20)
      • Trouble Shooting(Error) (37)
      • Algorithm (15)
      • Git,GitHub (8)
      • Diary (23)
      • 독서 (9)
      • Etc (6)
        • Mac (1)
        • 학원준비과정 (2)
  • 블로그 메뉴

    • 방명록
    • 태그
  • 공지사항

    • 안녕하세요 :)
  • 인기 글

  • 태그

    CSS
    코틀린
    국비지원학원
    HTML
    쌍용교육센터
    java
    java기초
    백엔드 개발자
    Kotlin
    oracle
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
야리니
[SIST] Srping_days04_Spring MVC
상단으로

티스토리툴바