프로그래머스 강의 듣기
: 별도의 설치 필요없이 로컬 개발용으로 빠르게 사용하기 좋은 경량 RDBMS 엔진
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.2</version>
<scope>runtime</scope>
</dependency>
: 브라우저에서 h2-console 화면을 통해 기본적인 데이터베이스 관리 및 쿼리 실행을 할 수 있음
spring:
h2:
console:
enabled: true
path: /h2-console
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/assets/**", "/h2-console/**");
}
관련 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>
HikariCP 기반 DataSource 설정
spring:
datasource:
driver-class-name: org.h2.Driver
url: "jdbc:h2:mem:spring_security;MODE=MYSQL;DB_CLOSE_DELAY=-1"
username: sa
password:
hikari:
minimum-idle: 1
maximum-pool-size: 5
pool-name: H2_DB
spring:
sql:
init:
platform: h2
schema-locations: classpath:sql/schema.sql
data-locations: classpath:sql/data.sql
encoding: UTF-8
: 실행되는 SQL 및 ResultSet을 로깅
BeanPostProcessor 인터페이스를 구현하여, DataSource 객체를 Log4jdbcProxyDataSource 타입으로 Wrapping 처리
@Component
public class DataSourcePostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof DataSource && !(bean instanceof Log4jdbcProxyDataSource)) {
return new Log4jdbcProxyDataSource((DataSource) bean);
} else {
return bean;
}
}
}
logback 설정을 통해 선택적으로 로깅 처리
<logger name="jdbc.sqltiming" level="INFO"/>
<logger name="jdbc.audit" level="OFF"/>
<logger name="jdbc.resultset" level="OFF"/>
<logger name="jdbc.resultsettable" level="INFO"/>
<logger name="jdbc.connection" level="OFF"/>
<logger name="jdbc.sqlonly" level="OFF"/>
org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl
구현체를 사용하면됨: 이름 그대로 JDBC를 통해 데이터베이스에서 사용자 인증 정보를 가져옴
select username, password, enabled from users where username = ? -- 사용자 조회
select username, authority from authorities where username = ? -- 사용자의 권한 조회
schema.sql
에서 제공하는 기본 테이블 구조가 JdbcDaoImpl 클래스에서 사용하는 쿼리에 적합하게 된것은 우연의 일치가 아님 (의도적으로 그렇게 만듬)@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication()
.dataSource(dataSource)
;
}
Refernece
1. 프로그래머스 백엔드 데브코스