@Value
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
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용 정적 팩토리 메소드 제공
StandaloneMockMvcBuilder
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
MockMvcBuilders.webAppContextSetup(WebApplicationContext context)
Junit Runner 설정
@ExtendsWith(SpringExtension.class)
WebApplicationContext 사용 설정 : default web root : src/main/webapp
@WebAppConfiguration
ApplicationContext 로딩
@ContextHierachy({
@ContextConfiguration(classes = { RootConfig.class }),
@ContextConfiguration(classes = WebConfig.class)
}
)
@Transactional