Spring-MVC

JooH·2024년 2월 21일
0

NHN_BackendAcademy

목록 보기
17/23

@Value

  • 어떤 값을 표현하는 Annotation
  • 필드, 메서드 파라미터, 생성자 파라미터에 사용

Spring EL 표현식

@Value("#{systemProperties.myProp}")

Property Placeholder

@Value("${my.app.myprop}")

@lombok.Value : 불변개체를 표현한다
다음 annotation을 다 합친 것과 같은 의미

* @Getter (no @Setter)
* @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)
* @AllArgsConstructor
* @ToString
* @EqualsAndHashCode
@Value
public class UserRegisterRequest {
    String id;
    String password;
    int age;
    String name;
}

MultiPart / Apache.commons.multipart 등을 쓸때 ~.properties에 upload.dir=C:\Users\~\download\ 로 설정을 하면 쓰기 편해진다
@Value("${upload.dir}") String uploadDir로 가져오면 되기 때문

Content Negotiation
/user/{userId} vs /users/{userId}

/user/{userId} : Content-type : text/html
/users/{userId} : Content-type : application/json

하지만 내용은? 동일하다

Content Negotiation

  • 동일한 내용을 어떤 포맷으로 응답할 것인지 결정하는 전략
    특정 parameter 값을 보고 결정할 것인지
    Accept Header 를 보고 결정할 것인지
  • HttpMessgaeConverter 에서 적용

Content Negotiation 설정

public class WebConfig implements WebMvcConfigurer {
    // ...

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorParameter(true)
                  .parameterName("format") // default : format
                  .ignoreAcceptHeader(true) // accept 헤더 무시?
                  .defaultContentType(MediaType.APPLICATION_JSON) 
                  .mediaType("json", MediaType.APPLICATION_JSON) // 미디어 타입 설정
                  .mediaType("xml", MediaType.APPLICATION_XML);
    }
}

Spring MVC Testing
pom.xml에 spring-test 추가

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <scope>test</scope>
</dependency>

MockMVC : Spring MVC 테스트의 주요 진입점(main entry point)

ResultActions perform(RequestBuilder requestBuilder) throws Exception

MockMvcRequestBuilders : RequestBuilder용 정적 팩토리 메소드 제공

  • get()
  • post()
  • put()
  • delete()
  • fileUpload()

StandaloneMockMvcBuilder

  • ApplicationContext 없이 Spring MVC 유닛 테스트(unit test) 수행
MockMvcBuilders.standaloneSetup(Object... controllers)


이런 메소드를 가지고 있음

public class HomeControllerTest {
    private MockMvc mockMvc;

    @BeforeEach
    void setUp() {
        mockMvc = MockMvcBuilders.standaloneSetup(new HomeController())
                                 .build();
    }

    @Test
    void test() {
        mockMvc.perform(get("/"))
               .andExpect(status().isOk())
               .andExpect(view().name("index"));
    }
}

DefaultMockMvcBuilder

  • ApplicationContext 를 가지고 Spring MVC 통합 테스트(integration test) 수행
MockMvcBuilders.webAppContextSetup(WebApplicationContext context)

Junit Runner 설정

  • Spring Test Context Framework의 Junit 기능 확장
@ExtendsWith(SpringExtension.class)

WebApplicationContext 사용 설정 : default web root : src/main/webapp

@WebAppConfiguration

ApplicationContext 로딩

  • @ContextHierachy / @ContextConfiguration
@ContextHierachy({
	@ContextConfiguration(classes = { RootConfig.class }),
    @ContextConfiguration(classes = WebConfig.class)
    }
)

@Transactional

  • 트랜잭션 내에서 테스트 수행하고 테스트 종료 후 자동 롤백된다
  • cf) @Rollback

0개의 댓글