05 스프링 빈 설정
p48 - src/main/java/spring/basic/service/UserService
public interface UserService {
void join(User user);
List<User> getUsers();
Optional<User> getUserByUserId(Long userId);
}
p49 - src/main/java/spring/basic/service/UserServiceImpl
@Component
public class UserServiceImpl implements UserService {
private static Long defaultUserId = 0L;
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(@Qualifier("userRepositoryImpl") UserRepository userRepository) {
this.userRepository = userRepository;
}
// @Autowired
// public UserServiceImpl(UserRepository userRepository) {
// this.userRepository = userRepository;
// }
@Override
public void join(User user) {
user.setUserId(++defaultUserId);
userRepository.save(user);
}
@Override
public List<User> getUsers() {
return userRepository.getUsers();
}
@Override
public Optional<User> getUserByUserId(Long userId) {
return userRepository.getUserByUserId(userId);
}
}
p50, 51, 52, - src/test/java/spring/basic/service/UserServiceImplTest
class UserServiceImplTest {
private UserServiceImpl userService;
private UserRepository userRepository;
@BeforeEach
void setUp() {
// UserRepository를 Mock 객체로 생성
userRepository = Mockito.mock(UserRepository.class);
// UserServiceImpl에 Mock된 UserRepository 주입
userService = new UserServiceImpl(userRepository);
}
@Test
void join() {
// given: 새로운 User 객체를 생성
User user = new User(null, "John Doe", "Gold", LocalDate.now(), LocalDate.now());
// when: 사용자를 등록(join)하고 저장
userService.join(user);
// then: save 메서드가 한번 호출되었는지 확인
verify(userRepository, times(1)).save(any(User.class));
assertNotNull(user.getUserId()); // userId가 자동으로 생성되었는지 확인
}
@Test
void getUsers() {
// given: User 목록을 미리 준비하여 Mock이 반환하도록 설정
List<User> mockUsers = Arrays.asList(
new User(1L, "John Doe", "Gold", LocalDate.now(), LocalDate.now()),
new User(2L, "Jane Doe", "Silver", LocalDate.now(), LocalDate.now())
);
when(userRepository.getUsers()).thenReturn(mockUsers);
// when: UserService를 통해 사용자 목록 조회
List<User> users = userService.getUsers();
// then: 반환된 목록이 Mock에서 제공한 내용과 일치하는지 확인
assertEquals(2, users.size());
assertEquals("John Doe", users.get(0).getName());
assertEquals("Jane Doe", users.get(1).getName());
// getUsers가 호출되었는지 확인
verify(userRepository, times(1)).getUsers();
}
@Test
void getUserByUserId() {
// given: 특정 사용자 ID로 조회할 수 있도록 Mock 설정
User mockUser = new User(1L, "John Doe", "Gold", LocalDate.now(), LocalDate.now());
when(userRepository.getUserByUserId(1L)).thenReturn(Optional.of(mockUser));
// when: UserService를 통해 ID가 1L인 사용자 조회
Optional<User> user = userService.getUserByUserId(1L);
// then: 사용자가 존재하고, 그 사용자의 정보가 올바른지 확인
assertTrue(user.isPresent());
assertEquals(1L, user.get().getUserId());
assertEquals("John Doe", user.get().getName());
// getUserByUserId가 호출되었는지 확인
verify(userRepository, times(1)).getUserByUserId(1L);
// 없는 사용자 조회 테스트
when(userRepository.getUserByUserId(2L)).thenReturn(Optional.empty());
Optional<User> notFoundUser = userService.getUserByUserId(2L);
assertTrue(notFoundUser.isEmpty()); // 사용자가 없을 때
}
}
p55 - src/main/java/spring/basic/AppConfig
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl(userRepository());
}
@Bean
public UserRepository userRepository() {
return new UserRepositoryImpl();
}
}
p56 - src/main/resources/logback.xml
<configuration>
<!-- DEBUG 레벨 로그 출력 -->
<logger name="org.springframework" level="DEBUG"/>
<logger name="org.springframework.beans.factory" level="DEBUG"/>
<logger name="org.springframework.context" level="DEBUG"/>
<!-- 콘솔에 로그 출력 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
p57 - src/main/java/spring/basic/BasicApplication
@SpringBootApplication
public class BasicApplication {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
UserService userService = ac.getBean("userService", UserService.class);
User user1 = new User(1L, "name2", "admin", LocalDate.now(), LocalDate.now());
userService.join(user1);
System.out.println("user1 = " + user1);
List<User> users = userService.getUsers();
System.out.println("users.get(0).getName() = " + users.get(0).getName());
// SpringApplication.run(BasicApplication.class, args);
}
}
p61(좌측 이미지), 62 - src/main/java/spring/basic/AppConfig
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl(userRepository());
}
@Bean
public UserRepository userRepository() {
return new UserRepositoryImpl();
}
}
p61(우측 이미지) - src/main/java/resources/appConfig.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- UserRepository 빈 정의 -->
<bean id="userRepository" class="spring.basic.repository.UserRepositoryImpl"/>
<!-- UserService 빈 정의 및 UserRepository 의존성 주입 -->
<bean id="userService" class="spring.basic.service.UserServiceImpl">
<constructor-arg ref="userRepository"/> <!-- 생성자 주입 -->
</bean>
</beans>
p63 - src/test/java/spring/basic/AppConfigTest
class AppConfigTest {
private ApplicationContext context;
@BeforeEach
void setUp() {
// ApplicationContext를 공통으로 초기화
context = new AnnotationConfigApplicationContext(AppConfig.class);
}
@Test
@DisplayName("userService 빈이 ApplicationContext에서 잘 생성되는지 테스트")
void userService() {
// userService 빈을 가져옴
UserService userService = context.getBean("userService", UserService.class);
// userService 빈이 생성되었는지 확인
assertNotNull(userService);
}
@Test
@DisplayName("userRepository 빈이 ApplicationContext에서 잘 생성되는지 테스트")
void userRepository() {
// userRepository 빈을 가져옴
UserRepository userRepository = context.getBean("userRepository", UserRepository.class);
// userRepository 빈이 생성되었는지 확인
assertNotNull(userRepository);
}
@Test
@DisplayName("userService를 이름으로 검색할 수 있는지 테스트")
void userServiceByName() {
// userService 빈을 이름으로 검색
UserService userService = (UserService) context.getBean("userService");
// userService 빈이 생성되었는지 확인
assertNotNull(userService);
}
@Test
@DisplayName("userRepository를 이름으로 검색할 수 있는지 테스트")
void userRepositoryByName() {
// userRepository 빈을 이름으로 검색
UserRepository userRepository = (UserRepository) context.getBean("userRepository");
// userRepository 빈이 생성되었는지 확인
assertNotNull(userRepository);
}
@Test
@DisplayName("존재하지 않는 빈을 검색할 때 NoSuchBeanDefinitionException 발생 테스트")
void beanNotFoundThrowsException() {
// 존재하지 않는 빈을 검색할 때 NoSuchBeanDefinitionException이 발생하는지 테스트
assertThrows(NoSuchBeanDefinitionException.class, () -> {
context.getBean("nonExistentBean");
});
}
}
Last updated