티스토리 뷰
글을 먼저 참고해보면 좋을 것 같다.!@
아주 기초적인(?) 흐름을 이해하기 위해 기록한 글이다.
** 틀린 내용이 있다면 피드백 감사히 받겠습니다..!
전체적인 구조는 아래와 같다.
| Config
root-context.xml 을 JAVA 코드로 옮긴 Config 파일.
@Configuration : 환경 설정 파일이라는 것을 명시
@ComponentScan("com.cristoval.web.model") : @Compoment어노테이션 및 streotype(@Service, @Repository, @Controller.) annotation 부여된 Class들을 자동으로 Scan하여 Bean으로 등록
1 2 3 4 5 | @Configuration @ComponentScan("com.cristoval.web.model") public class ApplicationConfig { } | cs |
servlet-context.xml 을 JAVA 코드로 옮긴 Config 파일.
@Configuration, @ComponentScan 은 위와 동일
@EnableWebMvc : annotation 기반의 SpringMvc를 구성할 때 필요한 Bean설정들을 자동으로 해주는 역할
1 2 3 4 5 6 7 8 9 | @Configuration @EnableWebMvc @ComponentScan("com.cristoval.web.controller") public class MVCConfig implements WebMvcConfigurer { // ... } | cs |
라이브러리의 Class를 Bean으로 써야할 경우 코드를 수정할 수 없으므로 @Component 를 추가해줄 수 없다.
이럴 경우 @Bean annotation 을 사용
1 2 3 4 5 6 7 | @Bean public InternalResourceViewResolver viewRoseolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } | cs |
| DTO
javaBeans는 아래와 같이 만들어져야 한다.
1. private member variable
2. default constructor, constructor
3. getter/setter
+. toString
| Repository
~Repository interface 와
~RepoImpl Class 구조로 이루어져 있다.
Repository는 @Repository로 명시해주어야 한다.
나중에 ComponentScan으로 찾아서 Bean으로 등록된다.
1 2 3 4 5 6 | @Repository public class UserRepoImpl implements UserRepository { // ... } | cs |
1 2 3 4 5 6 | @Repository public class BookRepoImpl implements BookRepository { // ... } | cs |
| Service
Service도 Repository와 비슷하게
~Service interface 와
~ServiceImpl Class 구조로 이루어져 있다.
@Service : Bean으로 관리되기 위해 명시
@Autowired : 각 상황의 타입에 맞는 IoC컨테이너 안에 존재하는 Bean을 자동으로 주입
private BookRepository bookRepo = new BookRepoImpl(); 는 완전 종속이 된다.
1 2 3 4 5 6 7 8 9 | @Service public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepo; // .. } | cs |
1 2 3 4 5 6 7 8 9 | @Service public class BookServiceImpl implements BookService { @Autowired private BookRepository bookRepo; // .. } | cs |
| JSP
JSP는 JSTL을 활용해서 작성해준다.
1 2 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:set value="${pageContext.request.contextPath }" var="root" scope="session"></c:set> | cs |
| Controller
@Controller : Bean으로 관리되기 위해 명시
@RequestMapping : method에 명시된 방식으로 value Path를 요청할 경우
@GetMapping : Get 방식으로 value Path를 요청할 경우
@PostMapping : Post 방식으로 value Path를 요청할 경우
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 32 33 34 35 36 37 38 39 40 41 | @Controller public class HomeController { @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); // Viwe에 데이터를 전달하고 싶다면 model 사용 // request.setAttribute 와 같은 방식 model.addAttribute("serverTime", formattedDate ); // View Name 만 return 시 forward 기법으로 전달 return "home"; // return : logical view name } @GetMapping("/redirect") public String redirect(Model model) { // redirect 방식으로 전달 return "redirect:/"; } // @RequestMapping(value = "/call") // @RequestMapping(value = "/call", method = RequestMethod.GET) @GetMapping("/call") public String call(Model model) { model.addAttribute("message", "View에 전달되는 데이터"); return "call"; } @PostMapping("/call") public String callPost(Model model) { model.addAttribute("message", "View에 전달되는 데이터"); return "call"; } } | cs |
@Controller : Bean으로 관리되기 위해 명시
@RequestMapping : Controller 기본 Mapping도 가능. 아래 코드에서 기본 Path는 /book/~
@Autowired : 각 상황의 타입에 맞는 IoC컨테이너 안에 존재하는 Bean을 자동으로 주입
@ModelAttribute : View 에서 넘어온 parameter를 DTO로 받을 수 있음
@CookieValue :
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 32 33 34 | @Controller @RequestMapping("/book") public class BookController { @Autowired private BookService service; // 도서 등록 화면 요청 @GetMapping("/regist") public String bookRegForm(HttpServletResponse res) { // 쿠키 설정 Cookie cookie = new Cookie("cookie", "this_is_cookie"); cookie.setMaxAge(10 * 60); cookie.setPath("/"); res.addCookie(cookie); return "regist"; } // 도서 등록 @PostMapping("/regist") public String bookReg(@ModelAttribute Book book, @CookieValue String cookie) { // @ModelAttribute : 화면에서 넘어온 파라미터들을 이용해서 DTO 생성 후 바로 받을 수 있음! // 클래스 첫글자를 소문자로 해서 바로 Model에 담아주기까지. mode.addAttribute("book", book); // 모델 연결 service.insert(book); return "result"; } } | cs |
@Controller : Bean으로 관리되기 위해 명시
@RequestMapping : Controller 기본 Mapping도 가능. 아래 코드에서 기본 Path는 /user/~
@Autowired : 각 상황의 타입에 맞는 IoC컨테이너 안에 존재하는 Bean을 자동으로 주입
@RequestParam : form의 name 그대로 형변환해서 받을 수 있음.
(required = false) 설정 시 값이 입력되지 않아도 허용
@ExceptionHandler : Controller에서 발생하는 해당 exception 타입의 예외를 모아줌
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 32 33 34 35 36 | @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService service; @GetMapping("/login") public String loginForm() { logger.debug("get login form 요청"); return "login"; } @PostMapping("/login") public String doLogin(@RequestParam String id, @RequestParam String password, @RequestParam(required = false) List<String> hobby, @RequestParam int age, HttpSession session) { logger.debug("post login 처리 ::: {}", id + " " + password + " " + age + " " + hobby); // 컨트롤러의 역할: // 1. 파라미터 처리 // 2. model 연동 UserInfo info = service.select(id); session.setAttribute("loginUser", info); // 3. 화면 전환 return "main"; } @ExceptionHandler // Controller에서 발생하는 exception 타입의 예외를 모아준다. public String handleError(Exception e) { e.printStackTrace(); return "500"; } } | cs |
+
@CrossOrigin : 다른 출처의 자원을 공유할 수 있도록 설정하는 권한, 외부 접속도 허용해준다.
'Web > Spring' 카테고리의 다른 글
[Spring-myBatis] Spring-myBatis 프로젝트를 만들어보자 ! (0) | 2020.10.23 |
---|---|
[MyBatis] MyBatis Setting 을 해보자 ! (4) | 2020.10.22 |
[Spring] Spring@MVC 프로젝트 세팅하기 (0) | 2020.10.21 |
[Spring] log4j.xml 로그 확인하기 (0) | 2020.10.21 |
[Spring] Spring AOP (0) | 2019.09.22 |