티스토리 뷰

반응형



[Spring] Spring@MVC 프로젝트 세팅하기 

글을 먼저 참고해보면 좋을 것 같다.!@


아주 기초적인(?) 흐름을 이해하기 위해 기록한 글이다.

** 틀린 내용이 있다면 피드백 감사히 받겠습니다..!


전체적인 구조는 아래와 같다.




| 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 : 다른 출처의 자원을 공유할 수 있도록 설정하는 권한, 외부 접속도 허용해준다.



반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday