backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  1. 스프링
  2. Spring Boot

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");
        });
    }
}
Previous04 테스트코드 실습Next스프링 빈 설정 보충자료

Last updated 6 months ago