ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 웹 MVC - 1 (스프링 부트 활용 - 5)
    Programming/Spring Boot 2020. 3. 10. 00:44
    728x90

    - 아무런 설정 없이 스프링 웹 MVC를 바로 사용할 수 있는 것은 AutoConfigure 덕분
    - WebMvcConfigurer 을 구현하여 스프링 자동 설정에 더해서 여러 설정을 입맛대로 변경 가능

    1. HttpMessageConverters
    - 스프링 프레임워크에서 제공하는 인터페이스
    - HTTP 요청 본문 객체로 변경하거나, 객체를 HTTP 응답 본문으로 변경할 때 사용
    {"username":hongchan, "password":"123"} <-> User
    - @RequestBody, @ResponseBody와 함께 쓰임


    1) 테스트 코드 작성

    @Test
        public void createUser_JSON() throws Exception {
            String userJson = "{\"username\":\"hongchan\", \"password\":\"123\"}";
            mockMvc.perform(post("/user/create")
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .accept(MediaType.APPLICATION_JSON_UTF8)
                    .content(userJson))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.username", is(equalTo("hongchan"))))
                .andExpect(jsonPath("$.password", is(equalTo("123"))));
        }


    2) UserController 작성

    - @RestController를 명시하면, @ResponseBody 와 @RequestBody는 생략가능

    @RestController
    public class UserController {
    
        @PostMapping("/user/create")
        public @ResponseBody User createUser(@RequestBody User user) {
            return user;
        }
    }
    

     


    3) User 작성

    public class User {
    
        private long id;
    
        private String username;
    
        private String password;
    
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    



    2. ViewResolver
    - Reqeust header에 있는 accept에 따라서 응답을 다르게 해줌
    - accept란? 클라이언트가 응답 받기원하는 형태 

    - 테스트 코드에서 accept를 변경

    @Test
        public void createUser_XML() throws Exception {
            String userJson = "{\"username\":\"hongchan\", \"password\":\"123\"}";
            mockMvc.perform(post("/user/create")
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .accept(MediaType.APPLICATION_XML)
                    .content(userJson))
                .andExpect(xpath("/User/username").string("hongchan"))
                .andExpect(xpath("/User/password").string("123"))
                .andDo(print());
        }



    - 의존성 추가
    <dependency>

    <groupId>com.fasterxml.jackson.dataformat</groupId>

    <artifactId>jackson-dataformat-xml</artifactId>

    <version>2.9.6</version>

    </dependency>


    3. 정적 리소스 지원
    - 이미 만들어져 있는 리소스를 제공하는 방법
    - 동적으로 뷰를 만드는 것이 아니라, 이미 있는 리소스를 제공하는 것
    - 기본 리소스 위치
    classpath:/static

    classpath:/public

    classpath:/resources/

    classpath:/META-INF/resources
    예) "/hello.html" => /static/hello.html


    - 맵핑 설정 변경 ("/hongchan/hello.html")
    spring.mvc.static-path-pattern=/hongchan/**

    - WebMvcConfigurer의 addResourceHandlers로 커스텀마이징 할 수 있음
    새로운 패스를 추가 (대체가 아님)

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/jiyun/**")
                    .addResourceLocations("classpath:/jiyun/")
                    .setCachePeriod(20);
        }
    }
    




    3. 웹 JAR
    - 클라이언트 사이드 자바스크립트 라이브러리(jQuery, Angular, Vue, React...)를 사용할 수 있게 함
    - mvnrepository에서 의존성 추가 후 <script src=""> 사용 
    - 리소스 체이닝? 의존성 추가 후 버전 없이 읽어올 수 있음


    4. Index 페이지와 파비콘

    - static 디렉토리에 index.html / favicon.ico 를 두면 자동으로 홈페이지, 파비콘으로 인식
    - 파비콘 설정 시 캐시 때문에 바로 변경 안되는 점 유의  (캐시 지우거나, 개인정보보호 모드로 테스트)



    인프런 백기선님 '스프링 부트’ 강의를 듣고 정리한 내용입니다.
    728x90

    댓글

Designed by Tistory.