config
- 여러 서비스의 설정 정보를 외부에서 따로 관리하는 것. 중앙에서 관리하는 것.
- 설정 정보의 변경 시 관리하기 편하도록 중앙에 따로 빼서 관리하는 것 -> 운영 중 설정값을 변경해야 하는 경우가 생기면, config-server만 변경하면 되기 때문에 재빌드 및 재배포가 필요 없음
- client와 설정 정보 저장소 간의 중간 다리 역할
출처
들어있는 것
- DB 설정 : 데이터 소스, JPA 설정 등
- Web 설정 : 웹 애플리케이션의 CORS 설정, 인터셉터 설정 등
- Security 설정 : Spring Security 설정
- Bean 설정 : 서비스, 레포지토리 등 bean의 설정
어노테이션
@Configuration
- 설정을 정의하는 클래스에 사용됨
- XML 설정 파일 대신 java를 사용하여 spring 설정을 구성할 수 있도록 함
@ComponentScan
- 특정 패키지를 기준으로 spring이 component를 자동으로 검색하고 등록하도록 함
- @ComponentScan(basePackages = "kr.co.project") : kr.co.project 패키지 내의 컴포넌트를 스캔하여 spring container에 bean으로 등록한다는 의미
- @Component, @Service, @Repository, @Controller, @RestController를 자동으로 스캔하여 빈으로 등록
- 즉, 설정한 패키지 내에서 스프링이 빈으로 인식할 수 있는 어노테이션이 붙어 있는 모든 것들을 빈으로 등록하는 것
@MapperScan
- mapper 인터페이스를 스캔하여 bean으로 등록
- 지정된 패키지 내에서 @Mapper 어노테이션이 붙은 interface를 찾아 spring bean으로 등록
- @MapperScan(basePackages = "kr.co.project", annotationClass = Mapper.class) : kr.co.project 패키지에서 @Mapper 어노테이션이 붙어 있는 Mapper Interface만 스캔하여 스프링 컨테이너에 빈으로 등록
@EnableWebMvc
- spring이 제공하는 web과 관련된 최신 전략 bean들이 등록됨
- @Enable~로 시작하는 어노테이션은 spring의 최신 전략들을 기반으로 설정을 자동화하는 기능을 가진 어노테이션임
- XML기반의 설정 파일을 작성할 필요 없이 자바 클래스를 통해 설정을 간편하게 관리할 수 있음
- Spring MVC의 기본 설정이 자동으로 적용됨
- 만약 이 어노테이션을 사용하지 않는다면 XML을 통해 직접 여러 설정을 구성해야 함
- 주요 설정 항목 : HandlerMapping(컨트롤러를 찾는 것), HandlerAdapter(HandlerMapping이 결정한 핸들러(http 요청을 처리하는 컴포넌트)를 실행), ExceptionResolver(요청 처리 중 발생한 예외 처리), MessageConverter(요청 본문을 적절한 객체로 변환하고 객체를 응답 본문으로 변환하여 클라이언트에게 반환), ViewResolver(컨트롤러가 반환한 뷰 이름을 실제 뷰 객체로 변환), 정적 자원 핸들러(정적 자원(css, js, 이미지 등)을 처리하고 제공, 요청된 정적 자원을 찾아 클라이언트에 반환), Validator(폼 데이터나 객체의 유효성 검사)
@EnableTransactionManagement
- 트랜잭션 관리 기능을 활성화 하는 어노테이션
- 트랜잭션이 필요한 메소드나 클래스에 트랜잭션 적용 가능
- 트랜잭션(Transaction) : DB 시스템에서 하나의 논리적 작업 단위를 구성하는 연산 집합. DB의 상태를 일관되게 유지하는 것을 목적으로 함.
- 이 어노테이션이 붙은 메소드 내의 모든 작업이 성공적으로 완료되면 DB에 변경 사항이 반영되고, 그렇지 않으면 트랜잭션이 롤백되어 변경 사항이 반영되지 않는 것
- config 클래스에 이 어노테이션을 사용하면 애플리케이션의 모든 트랜잭션이 일관되게 관리됨
메소드
View Resolver(뷰 리졸버)
- 컨트롤러가 반환하는 뷰 이름을 실제 뷰 파일 경로로 변환하여 클라이언트에게 응답을 생성
- jsp 파일을 view로 사용할 때, 컨트롤러가 반환하는 뷰 이름을 실제 jsp 파일의 경로로 변환 -> jsp파일을 사용하여 클라이언트에게 응답을 생성할 수 있음
// ViewResolver 설정(JSP 경로)
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
- 뷰 파일의 기본 경로 설정 : "/WEB-INF/views/" -> jsp 파일들은 이 경로 아래에 위치해야 함
- 뷰 파일의 확장자 설정 : ".jsp" -> .jsp 파일 사용
=> '/WEB-INF/views/' 경로 아래의 '.jsp'파일들을 view로 사용하도록 설정하는 것
- 컨트롤러는 단순히 논리적인 뷰 이름만 반환하기 때문에, 반환된 뷰 이름을 실제 파일 경로로 변환하여 jsp 파일을 찾도록 해 주는 것
- 정적 리소스를 Spring MVC의 컨트롤러가 아닌 톰캣과 같은 서블릿 컨테이너에서 직접 처리하도록 하는 것
- 정적 리소스를 서블릿 컨테이너가 직접 처리하면 Spring MVC의 요청 처리 체인을 거치지 않기 때문에 성능이 향상됨
- 정적 리소스 요청이 들어올 때 Spring MVC가 가로채지 않고 서블릿 컨테이너가 직접 처리하도록 하여 클라이언트에게 응답을 반환함
// 정적페이지 처리(컨트롤러가 아니라 톰캣에서 처리하기 위해)
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
- configurer.enable()을 호출하면 서블릿 컨테이너의 Default Servlet(기본 서블릿)이 활성화됨. 이후 Default Servlet은 '/static', '/public', '/resources', '/META-INF/resources' 경로 아래의 정적 리소스를 처리
addViewControllers & 비즈니스 로직이 필요 없는 URL Mapping
- 단순히 특정 URL을 뷰(View) 이름에 매핑하기 위해 사용됨
- 컨트롤러를 작성하지 않고도 특정 URL에 대해 응답할 수 있도록 설정하는 것
- 비즈니스 로직 : 애플리케이션이 제공하는 기능의 핵심적인 부분. 데이터 처리, 계산, DB 연동 등 클라이언트의 요청을 처리하는 데 필요한 모든 로직
ex) 사용자의 로그인 시 자격 증명을 검증하고, 인증된 사용자의 정보를 세션에 저장하는 과정
- 비즈니스 로직이 필요 없는 URL : 특별히 데이터 처리나 연산이 필요하지 않고 특정 페이지를 랜더링하기만 하는 URL
ex) 정적 페이지, 정보 제공 페이지
HikariCP
- JAVA 애플리케이션에서 사용하는 고성능 JDBC 커넥션 풀링 라이브러리
- DB 연결을 효율적으로 관리하고, 성능을 최적화하여 애플리케이션의 DB 접근 속도를 높이는 데 사용됨
- Connection Pool(커넥션 풀) 사용 : DB 연결을 미리 생성해두고, 애플리케이션이 필요할 때마다 재사용할 수 있도록 하는 것
// HikariCP
@Bean
public HikariDataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
dataSource.setDriverClassName(driver);
dataSource.setJdbcUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
MyBatis
- SqlSessionFactory : MyBatis의 설정을 Spring이 Bean으로 관리할 수 있게 하는 객체. DB 세션을 관리하고 Mapper interface를 통해 SQL 쿼리를 실행함
- ssf.setDataSource(dataSource()) : MyBatis가 사용할 데이터 소스(DB 연결을 관리하는 객체) 설정
- ssf.getObject() : SqlSessionFactory객체를 반환. MyBatis와 DB간의 session을 관리하는 데 사용됨