gradle 추가 implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16' datasource 설정 변경 spring: datasource: hikari: #jdbc-url: jdbc:mysql://127.0.0.1:3306/ #driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:log4jdbc:mysql://127.0.0.1:3306/ driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy logging 설정 logging: level: jdbc.sqlonly: OFF jdbc.audit: OFF jdbc.resultset: OFF jdb..
gradle 추가 dependencies { testImplementation("org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.3.0") } @MybatisTest @MybatisTest를 사용하면 불필요한 빈들은 로드되지 않으므로 더 가볍고 빠른 테스트가 가능 @MybatisTest @ActiveProfiles("mysql") @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) //Using a real database @ContextConfiguration(classes = {MyBatisConfig.class, DataSourceConfig.class})/..
yml DataSource 설정 spring.datasource.primary.url=jdbc:mysql://localhost:3306/db1 spring.datasource.primary.username=user1 spring.datasource.primary.password=pass1 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db2 spring.datasource.secondary.username=user2 spring.datasource.secondary.password=pass2 spring.datasource..
SqlSessionFactory MyBatis에서 SQL 세션을 생성하는 중요한 인터페이스 데이터베이스와의 연결을 설정하고 SQL 문을 실행하는데 사용되는 SQL 세션 객체를 생성 SqlSessionFactory를 생성하면 MyBatis의 SqlSession을 생성하고 데이터베이스와의 상호 작용을 수행 SqlSession은 SQL 쿼리를 실행하고 결과를 얻을 수 있는 인터페이스 @Configuration public class MyBatisConfig { @Bean public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean ses..
현상 Spring Boot 2.5.* 내장 Tomcat 에서는 URL parameter에 특수문자가 있으면 400 error 발생 조치 원칙상 클라이언트에서 특수문자를 인코딩하여 호출해야하지만, 허용이 필요한 특수문자가 있을 수 있음. Tomcat에 relaxedQueryChars 옵션으로 특수문자 허용 설정 @Component public class TomcatWebServerConfig implements WebServerFactoryCustomizer { @Override public void customize(TomcatServletWebServerFactory factory) { factory.addConnectorCustomizers(connector -> connector.setPropert..
이벤트 발생 시 처리할 동작을 메소드로 정의 @Component public class XX implements ApplicationListener{ public void onApplicationEvent(ContextRefreshedEvent event){ } } ContextRefreshedEvent Published when the ApplicationContext is initialized or refreshed, for example, using the refresh() method on the ConfigurableApplicationContext interface. "Initialized" here means that all beans are loaded, post-processor bean..
applicationContext 초기화(refresh) 이전에 작업이 필요할 경우 ApplicationContextInitializer initialize 메소드에 구현하여 사용 public class XXInitializer implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplicationContext){ //로직 구현 } } web.xml contextInitializerClasses XXInitializer
Client에서 Server로 데이터를 전송할 때 HTTP Request Headers에 content-type 설정에 따라 HTTP Request Message Body 데이터 포멧이 달라지기 때문에 Server에서 데이터 수신 방식이 달라짐 application/x-www-form-urlencoded HTML form, .ajax 요청 헤더에 default content-type 값 key=value 포멧 Server Side 서블릿에서 Request Body를 Map 형태로 변환 Controller에서 @RequestParam, request.getParameter("param"), @ModelAttribute Command 객체 바인딩 가능 application/json {"key" : "valu..
EntityManagerFactoryJPA를 동작시키기 위한 기반 객체를 만들고 DB 커넥션 풀 생성META-INF/persistence.xml 에 있는 정보를 바탕으로 생성생성 비용이 크기 때문에 한번만 생성하고 공유해서 사용여러 스레드가 동시에 접근해도 안전. 공유 가능EntityManager엔티티를 저장, 수정, 삭제, 조회 등 모든 일을 처리. 가상의 데이터베이스엔티티 매니저 팩토리에서 엔티티 매니저를 생성. 비용은 거의 들지 않음여러 스레드가 동시에 접근하면 문제 발생. 공유 금지DB 연결이 꼭 필요한 시점까지 커넥션을 얻지 않음. 트랜잭션을 시작할 때 커넥션을 획득영속성 컨텍스트 (Persistence Context)엔티티를 영구 저장하는 환경엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고..
SQL을 직접 다룰 때 발생하는 문제점 진정한 의미의 계층 분할이 어렵다 엔티티르르 신뢰할 수 없다 SQL에 의존적인 개발을 피하기 어렵다 JPA Java ORM(Object-Relation Mapping) 기술 표준 API 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결 정교한 객체 모델링을 할 수 있고 객체지향 개발에 집중할 수 있다 생산성 : SQL을 작성하고, JDBC API를 사용하는 반복적인 일을 JPA가 대신 처리 유지보수 : JPA가 대신 처리해주므로 수정해야할 코드가 줄어듦 패러다임의 불일치 해결 : 상속, 연관관계, 객체 그래프 탐색, 비교하기 해결 성능 : 애플리케이션과 DB 사이에서 다양한 성능 최적화 기회 제공 데이터 접근 추상화와 벤더 독립성 : 특정 DB 기..