23.03.02 (취업일지) 내가 만든 홈페이지

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";
    }
}
  1. @RestController 주석은 클래스가 REST API를 처리하는 컨트롤러임을 나타냅니다.

  2. @GetMapping(“/hello”) 주석은 GET 메서드를 처리하는 API 엔드포인트를 /hello 경로에 매핑합니다.

  3. 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"));
    }
}
  1. @SpringJUnitConfig 주석을 사용하면 테스트에서 Spring Boot 애플리케이션 컨텍스트를 로드하고 사용할 수 있습니다.

  2. @WebMvcTest(controllers = HelloController.class) 주석을 사용하면 HelloController 클래스를 테스트하는 데 필요한 빈만 로드하여 테스트할 수 있습니다.

  3. private MockMvc mockMvc 필드는 Spring의 MockMvc 객체가 주입되고 테스트에서 사용될 수 있도록 합니다.

  4. 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 클래스를 테스트할 수 있습니다.