일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 내림차순정렬
- 스프링
- Java
- 계산기GUI
- Eclipse
- 배열정렬
- 자바알고리즘
- GUI
- 버블소트
- MVC
- Spring
- 오름차순정렬
- Swing
- 알고리즘
- 숫자정렬
- 자바GUI
- 자바
- 이클립스 #이클립스단축키 #자바 #자바단축키
- 버블정렬
- annotation
- 이클립스
- 어노테이션
- 계산기
- 자바 계산기
- 자바 #java #이클립스 #eclipse #switch #switch문 #사칙연산 #계산기 #calculator #간단한계산기
- Today
- Total
온 코딩
[Spring] (게시판예제) Spring MVC 모델 - @annotation 이용 본문
- 어노테이션을 사용하는 이유 : XML 설정을 최소화하기 위해
: 컨트롤러를 고정해서 사용하는 경우, 특히 특정 기업에 대한 어플리케이션 개발 시 많이 사용
+ xml 문서 : 컨트롤러가 수시로 변경되는 경우 => 주로 솔루션 개발 업체에서 많이 사용
+ 어노테이션과 xml을 혼용 시
: 향후 추가 될 여지가 있는 경우에 혼용, 거의 어노테이션으로 작업해놓고 추가되는 부분은 xml로 처리
MVC 어노테이션 설정 방법
- 설정파일 문서에 context xml namespace를 추가
- 설정 파일 내부에 <bean>객체들 대신 <context:component-scan>으로 대체하여 지정한 패키지의 하위까지 검색하여 자동으로 객체들을 등록할 수 있도록 설정
- 컨트롤러 역할을 담당하는 모든 클래스 선언부에 @Controller 어노테이션을 추가하여 DispatcherServlet이 인식할 수 있는 컨트롤러 객체로 만듦.
- 사용자 요청에 따른 호출 메서드 설정 @RequestMapping(value="")를 각 컨트롤러 클래스의 해당 메서드 위에 어노테이션으로 설정
- 만약 @Controller 어노테이션을 사용하지 않을 경우, 스프링이 제공하는 Controller 인터페이스를 구현받고 HandlerRequest() 메서드에 대한 재 정의 필요
- @RequestMapping의 value 속성은 생략할 수 있지만 생략할 시, 검색을 수행해야하기 때문에 속도가 떨어짐
- 스프링 컨테이너가 자동으로 생성하는 Command객체를 통해 VO값 자동 맵핑하여 매개변수로 받을 수 있음
- VO / DAO / Model(화면전환 할 때 보내야 하는 객체가 있을 경우 주로 사용) 모두 매개변수로 객체를 받을 수 있음
- 반환 타입은 일반적으로 String이고, 화면 전환 시 return값에 따라 "redirect:" 접두사를 추가하여 재요청 실행
Command 객체
=> insertBoard()등 메서드의 매개변수 타입을 BoardVO 타입으로 변경하여 스프링 컨테이너가 insertBoard()를 호출할 때 사용자 입력 값들을 Command 객체에 넘겨주고 이 Command 객체를 insertBoard(BoardVO vo)의 매개변수인 vo 변수에 전달하여 자동 맵핑되도록 한다.
: 매번 다르게 넘어오는 파라미터 값들을 가져오고 세팅할 필요없이 Command 객체를 통해 기존 vo에서 사용자 입력 부분을 자동으로 추출하고 값을 설정해서 다시 메서드 매개변수 vo로 넘어온다.
- BoardVO 내부의 멤버 변수 명과 사용자 입력을 받는 파라미터 name 값이 일치해야 사용 가능
- BoardVO 객체의 멤버변수는 반드시 private이어야 하고 getter/setter 메서드가 있어야 함
예시 )
package com.hhw.view.board;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.hhw.biz.board.BoardVO;
import com.hhw.biz.board.impl.BoardDAO;
@Controller
public class InsertBoardController{
public InsertBoardController() {
}
@RequestMapping(value="/insertBoard.do")
public String insertBoard(BoardVO vo, BoardDAO boardDAO){
System.out.println("어노테이션 컨트롤러 : 글 등록 처리");
//1. 사용자 입력 정보 추출 - Command 로 자동 등록
//2. DB 연동처리
boardDAO.insertBoard(vo);
//3. 화면 전환 - 요청보내기
return "redirect:getBoardList.do";
}//POJO 스타일
}
- Controller 메서드가 실행되고 View 경로를 "getBoardList.do"로 리턴하면 기본적으로 포워딩 방식이므로 브라우저 URL 변경이 이루어지지 않아 요청을 보낼 수 없다. URL을 변경하고 싶으면 "redirect:getBoardList.do"로 리턴하여 리다이렉트를 해야 함
- 재요청 없이 화면 전환만 필요한 경우는 리다이렉트 할 필요 없음
컨트롤러 예시)
package com.hhw.view.user;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.hhw.biz.user.UserVO;
import com.hhw.biz.user.impl.UserDAO;
@Controller
public class LoginController{
public LoginController() {
}
@RequestMapping(value="/login.do", method=RequestMethod.POST)
public String login(UserVO vo, UserDAO userDAO,HttpSession session){
System.out.println("어노테이션 컨트롤러 : 로그인 처리");
if (userDAO.getUser(vo) != null) {
session.setAttribute("name", userDAO.getUser(vo).getName());
return "redirect:getBoardList.do";
} else {
return "login.jsp";
}
}
@RequestMapping(value="/login.do", method=RequestMethod.GET)
public String loginView(@ModelAttribute("user") UserVO vo){
System.out.println("로그인 화면으로 이동");
vo.setId("test");
vo.setPassword("test");
return "login.jsp";
//login.jsp 화면에서 UserVO 객체의 값이 스프링 컨테이너에 의해 자동으로 전달 됨
//Command로 생성되는 객체명은 userVO => JSP에서 사용 시, EL태그를 통해 userVO.id이렇게 쓰기 가능
//매개변수 앞에 @ModelAttribute("user")이렇게 지정하면 객체명이 user가 됨
}
}
기타 어노테이션
1. @RequestParam
- VO에 없는 변수를 사용할 경우 VO 클래스의 수정 없이 @RequestParam을 이용하여 파라미터 사용 가능
- HttpServletRequest.getParameter()메서드와 같은 기능
- @RequestParam(value="파라미터 이름" ) String 사용 할 변수명 <- 가장 간단한 버전
- @RequestParam(value="파라미터 이름", defaultValue="기본값", required=false/true) String 사용 할 변수명
@RequestMapping(value = "/getBoardList.do")
public String getBoardList(@RequestParam(value = "searchCondition", defaultValue = "TITLE") String condition,
@RequestParam(value = "searchKeyword", defaultValue = "") String keyword, BoardVO vo, BoardDAO boardDAO,
Model model) {
System.out.println("어노테이션 컨트롤러 : 글 목록 검색 처리");
System.out.println(condition +" : "+ keyword);
model.addAttribute("boardList", boardDAO.getBoardList(vo)); // model정보
// 저장
return "getBoardList.jsp";
}
2. @ModelAttribute
- Command 객체 이름 변경할 때사용
- View(JSP)에서 사용할 데이터를 설정하는 용도로 사용 - 자동으로 Model에 저장됨
- 만약 @RequestMapping보다 위에(먼저) 호출 되었으면 @RequestMapping 메서드들 내부에서 @ModelAttribute값 사용 가능
//검색 조건 목록
@ModelAttribute("conditionMap")
public Map<String, String> searchConditionMap(){
Map<String, String> conditionMap = new HashMap<String, String>();
conditionMap.put("제목", "TITLE");
conditionMap.put("내용", "CONTENT");
return conditionMap;
}
// 글 목록검색 - 여기 Model객체에 이미 conditionMap 저장 완료
@RequestMapping(value = "/getBoardList.do")
public String getBoardList(@RequestParam(value = "searchCondition", defaultValue = "TITLE") String condition,
@RequestParam(value = "searchKeyword", defaultValue = "") String keyword, BoardVO vo, BoardDAO boardDAO,
Model model) {
System.out.println("어노테이션 컨트롤러 : 글 목록 검색 처리");
System.out.println(condition +" : "+ keyword);
model.addAttribute("boardList", boardDAO.getBoardList(vo)); // model정보
// 저장
return "getBoardList.jsp";
}
- getBoardList 컨트롤러 내 Model객체에 boardList뿐 아니라 conditionMap까지 저장이 되어있기 때문에 getBoardList.jsp에서 두 값 모두 접근 가능
3. @SessionAtrributes
- Command객체에 값들이 선택적으로 저장 되어 있는데, 모든 값들을 다 저장해 사용하고 싶을 경우 사용
- 메서드선언부가 아닌 클래스 선언부에 @SessionAttributes("board") 설정
- 애플리케이션 동작 시 Model에 "board"라는 값으로 저장되는 데이터를 세션에 자동으로 저장해놓으라는 의미
- 세션에 저장된 값을 다른 컨트롤러에서 사용하고 싶으면 컨트롤러 매개변수 앞에 @ModelAttribute("board") BoardVO vo 이런 형식으로 매개변수 수정 -> 세션에 저장된 board를 vo에 할당 한 후, 사용자 입력 파람을 vo 객체에 할당 => vo에서 사용자 입력 값만 수정 됨
@Controller
@SessionAttributes("board")
public class BoardController {
public BoardController() {
}
// 글 상세조회
@RequestMapping(value = "/getBoard.do")
public String getBoard(BoardVO vo, BoardDAO boardDAO, Model model) {
System.out.println("어노테이션 컨트롤러 : 글 상세조회 처리");
// 리턴 - 검색 결과는 model에 저장
model.addAttribute("board", boardDAO.getBoard(vo)); // model정보 저장
return "getBoard.jsp";
}
// 글 수정
@RequestMapping(value = "/updateBoard.do")
public String updateBoard(@ModelAttribute("board") BoardVO vo, BoardDAO boardDAO) {
System.out.println("어노테이션 컨트롤러 : 글 업데이트 처리");
System.out.println("글쓴이 : " + vo.getWriter());
boardDAO.updateBoard(vo);
return "redirect:getBoardList.do";
}
}
- 글 상세보기에서 updateBoard.do 컨트롤러를 불러와 사용할 경우 이미 Model에 board 객체를 저장했기 때문에 이 값이 세션에 저장되어 있음
- 따라서, updateBoard 컨트롤러에 전달되는 매개변수는 board값에 사용자 입력값이 업데이트 된 객체!
- 객체 안에 각 변수가 null값 없이 저장되어 있음
지금까지 어노테이션 모음
현재포스팅
@Controller
@RequestMapping(value="/login.do", method=RequestMethod.POST)
@ModelAttribute("user") UserVO vo / @ModelAttribute("conditionMap")
@RequestParam(value="파라미터 이름" ) String 사용 할 변수명
@sessionAttributes("board")
2021.06.16 - [복습 ARCHIVE/모델별 프로젝트] - [Spring] DI 설정 - 어노테이션
[Spring] DI 설정 - 어노테이션
DI 설정 방법 1. 설정 파일 내의 으로 설정 2. 설정 파일 내에서 검색하는 방법 1) 조건 의 xmlns 추가 (context) xmlns:context="http://www.springframework.org/schema/context" 2) 검색 될 컴포넌트(클래..
on-coding.tistory.com
@AuroWired
@Qualified
@Inject
@Resource
2021.06.18 - [복습 ARCHIVE/모델별 프로젝트] - [Spring] 어노테이션을 활용한 AOP
[Spring] 어노테이션을 활용한 AOP
xml을 사용할 경우 어노테이션을 활용할 경우 - 어드바이스 파일 내에 생성 : 이때 만들어지는 메서드는 기능로직이 없는 포인트 컷만을 위한 메서드 package com.hhw.biz.common; import org.aspectj.lang.JoinPo.
on-coding.tistory.com
@Service
@Aspect
@Before 등 어드바이스
@pointcut
'복습 ARCHIVE > 모델별 프로젝트' 카테고리의 다른 글
[Spring](게시판 예제) 파일 업로드 기능 (0) | 2021.06.28 |
---|---|
[Spring] (게시판 예제)프레젠테이션레이어와 비즈니스레이어 통합 (0) | 2021.06.28 |
[Spring](게시판예제)Spring MVC 사용법 - xml 설정파일 이용 (0) | 2021.06.22 |
[Spring] (게시판예제)스프링 MVC 구조 구현 - DispatcherServlet, HadlerMapping , Controller, ViewResolver 직접 만들기 (0) | 2021.06.22 |
[Spring] Spring Legacy Project 에서 웹경로 수정하기 (0) | 2021.06.21 |