Spring Boot와 AWS로 직접 구현한 웹 서비스
혼자 강의를 듣고 부족한 점이 많다고 느껴서 이 책을 구매하게 되었습니다.
Immortal Deadlock이라는 이름으로 3월부터 함께 공부를 했고, 서로의 목표를 계획하고 취직할 때까지 서로 피드백을 주고받는 등 온갖 일을 함께 합니다.
#3월기획
- 3/12 및 3/26 토익 시험
- Spring Boot 및 AWS를 사용하여 직접 웹 페이지 구현 완료
- 제 목표는 매일 Effective Java의 2장을 읽는 것입니다.
#오늘 뭐 배웠어?
1. Jcenter()와 mavencentral()은 혼용 가능하지만 최신 라이브러리를 사용하고 싶다면 mavencentral() 사용.
2. intellj git .gitignore를 사용하는 이유
.아이디어 디렉터리는 IntelliJ IDEA IDE가 프로젝트 설정을 저장하는 디렉터리입니다.
이 디렉토리에는 프로젝트 설정, 라이브러리 종속성, 컴파일된 클래스 파일 등이 포함됩니다.
Git을 사용하여 이 디렉터리를 관리하면 다른 개발자가 IntelliJ IDEA에서 프로젝트를 실행할 때 문제가 발생할 수 있습니다.
3. 테스트 코드 작성
package com.dawon.book.springboot.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
- @RestController 주석은 클래스가 REST API를 처리하는 컨트롤러임을 나타냅니다.
- @GetMapping(“/hello”) 주석은 GET 메서드를 처리하는 API 엔드포인트를 /hello 경로에 매핑합니다.
- hello() 메서드는 GET 요청을 처리하고 /hello 경로에 대한 요청이 있을 때 문자열 “hello”를 반환합니다.
따라서 이 코드가 실행될 때 localhost:8080/hello 경로에 대한 GET 요청은 문자열 “hello”를 반환합니다.
3-2 테스트 코드
package com.dawon.book.springboot.web;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@SpringJUnitConfig
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void helloTest() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/hello"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("hello"));
}
}
- @SpringJUnitConfig 주석을 사용하면 테스트에서 Spring Boot 애플리케이션 컨텍스트를 로드하고 사용할 수 있습니다.
- @WebMvcTest(controllers = HelloController.class) 주석을 사용하면 HelloController 클래스를 테스트하는 데 필요한 빈만 로드하여 테스트할 수 있습니다.
- private MockMvc mockMvc 필드는 Spring의 MockMvc 객체가 주입되고 테스트에서 사용될 수 있도록 합니다.
- helloTest() 메서드는 HelloController의 /hello API 엔드포인트가 작동하는지 확인하는 테스트입니다.
MockMvcRequestBuilders.get(“/hello”)를 호출하여 /hello 경로에 GET 요청을 보내고, MockMvcResultMatchers.status().isOk()는 응답 코드가 200인지 확인하고, MockMvcResultMatchers.content().string(“hello”) 응답 본문을 확인하려면 “hello”입니다.
따라서 이 테스트를 수행할 때 /hello 경로로 GET 요청이 시작되면 응답 코드는 200이고 응답 본문은 “hello”입니다.
4. 테스트 코드 동향
예
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUser(Long id) {
return userRepository.findById(id).orElse(null);
}
public List<User> getUsers() {
return userRepository.findAll();
}
}
이 클래스를 테스트할 때, @SpringBootTest그리고 @AutowiredUserRepository는 bean을 주입하여 사용할 수 있지만 각 테스트 케이스에 대한 bean을 직접 생성하거나 mock 객체를 사용하여 테스트할 수 있습니다.
public class UserServiceTest {
private UserService userService;
private UserRepository userRepository;
@BeforeEach
public void setUp() {
userRepository = Mockito.mock(UserRepository.class);
userService = new UserService(userRepository);
}
@Test
public void testGetUser() {
User user = new User(1L, "John Doe", "[email protected]");
Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(user));
User result = userService.getUser(1L);
assertEquals(user, result);
}
@Test
public void testGetUsers() {
List<User> users = Arrays.asList(
new User(1L, "John Doe", "[email protected]"),
new User(2L, "Jane Doe", "[email protected]")
);
Mockito.when(userRepository.findAll()).thenReturn(users);
List<User> result = userService.getUsers();
assertEquals(users, result);
}
}
위의 코드에서 @비포에치 주석을 사용하여 각 테스트 케이스를 실행하기 전에 UserRepository의 모의 객체를 생성하여 UserService 클래스의 생성자에 주입하여 사용합니다.
이를 통해 UserRepository의 동작을 확인하고 UserService 클래스를 테스트할 수 있습니다.