[SpringBoot] TIL 075 - 23.11.09

유진·2023년 11월 8일
0

SpringBoot : DB 연결

  • 기존 : DBCP 사용 (데이터베이스 커넥션 풀)

  • HiKariCp -> 속도가 빠르고 메모리 별로 차지하지 않음 (Boot 사용 시 대부분 사용)

  • 우리 = HiKariCp + Mybatis 사용할 예정

build.gradle

Ctrl + Shift + F5 (Refresh Gradle Project 꼭 하기)


들어와 있다면 잘 한 것

application.properties : 외부 설정 파일

  • appliction : 어플리케이션이 가지고 있는 여러 기능들을 설정하는 파일
    Spring Boot 시작 시, 자동으로 읽음 -> 설정을 실행

CF ) 보통 파일을 따로 만듬! = 개발, 운영 계정명 / 비밀번호 다를 수 있어서
개발환경 : dev.properties
운영 : prod.properties

  • 나중에 프로젝트할 때, .gitignore에 config.properties 넣어야 함!


config.properties

#오라클 DB 연결 정보
spring.datasource.hikari.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.hikari.username=project
spring.datasource.hikari.password=project1234

# HikariCP Connection Pool Properties
#풀이 연결을 사용할 수 있을 때까지 대기하는 최대 시간(ms)을 지정
spring.datasource.hikari.connection-timeout=30000

#풀의 최대 연결 수 설정
spring.datasource.hikari.maximum-pool-size=20

#연결이 풀에서 유휴 상태로 있을 수 있는 최대 시간(ms)을 지정
spring.datasource.hikari.idle-timeout=600000

#연결 풀의 이름을 지정
spring.datasource.hikari.pool-name=MyHikariCP

#자동 커밋 끄기
spring.datasource.hikari.auto-commit=false

DBConfig.java

package edu.kh.project.common.config;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration // @Configuration : 구성
// 스프링 어플리케이션을 구성하기 위한 설정용 Bean 생성 클래스

@PropertySource("classpath:/config.properties")
public class DBConfig {

	// import org.springframework.context.ApplicationContext;
	@Autowired
	private ApplicationContext applicationContext; // application scope 객체
	
	@Bean 
	// - 개발자가 수동으로 bean을 등록하는 어노테이션
	// - @Bean 어노테이션이 작성된 메서드에서 반환된 객체는
	// Spring Container가 관리함
	
	@ConfigurationProperties(prefix = "spring.datasource.hikari") // 접두사가 spring.datasource.hikari로 시작되는 것 다 읽어와 hikariConfig 객체를 만든다는 의미
	// properties 파일의 내용을 이용해서 생성되는 bean을 설정하는 어노테이션
	// prefix를 지정하여 spring.datasource.hikari으로 시작하는 설정을 모두 적용
	public HikariConfig hikariConfig() { // Ctrl + Space = 메소드 이름 추천해줌
		return new HikariConfig();
	}
	
	@Bean
	public DataSource dataSource(HikariConfig config) {
		 					// 매개변수에 bean이 자동으로 주입된다(DI)
		
		DataSource dataSource = new HikariDataSource(config);
		return dataSource;
	}
	
}


-> 로그에 오류가 뜨지 않으면 성공!


Mybatis

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<setting name="jdbcTypeForNull" value="NULL" />
	</settings>
</configuration>


내부적으로 Member라는 dto 자동생성해줌 -> 별칭은 소문자, 대문자 모두 가능!

DBConfig.java

package edu.kh.project.common.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration // @Configuration : 구성
// 스프링 어플리케이션을 구성하기 위한 설정용 Bean 생성 클래스

@PropertySource("classpath:/config.properties")
public class DBConfig {

	// import org.springframework.context.ApplicationContext;
	@Autowired
	private ApplicationContext applicationContext; // application scope 객체
	
	@Bean 
	// - 개발자가 수동으로 bean을 등록하는 어노테이션
	// - @Bean 어노테이션이 작성된 메서드에서 반환된 객체는
	// Spring Container가 관리함
	
	@ConfigurationProperties(prefix = "spring.datasource.hikari") // 접두사가 spring.datasource.hikari로 시작되는 것 다 읽어와 hikariConfig 객체를 만든다는 의미
	// properties 파일의 내용을 이용해서 생성되는 bean을 설정하는 어노테이션
	// prefix를 지정하여 spring.datasource.hikari으로 시작하는 설정을 모두 적용
	public HikariConfig hikariConfig() { // Ctrl + Space = 메소드 이름 추천해줌
		return new HikariConfig();
	}
	
	@Bean
	public DataSource dataSource(HikariConfig config) {
		 					// 매개변수에 bean이 자동으로 주입된다(DI)
		
		DataSource dataSource = new HikariDataSource(config);
		return dataSource;
	}
	
	
	////////////////////////////Mybatis 설정 추가 ////////////////////////////
	
	//SqlSessionFactory : SqlSession을 만드는 객체
	@Bean
	public SqlSessionFactory sessionFactory(DataSource dataSource) throws Exception{
		
		SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
		sessionFactoryBean.setDataSource(dataSource);
		
		//매퍼 파일이 모여있는 경로 지정
		sessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mappers/**.xml"));
		
		//별칭을 지정해야하는 DTO가 모여있는 패키지 지정
		//-> 해당 패키지에 있는 모든 클래스가 클래스명으로 별칭이 지정됨
		//sessionFactoryBean.setTypeAliasesPackage("edu.kh.project.member.model.dto, edu.kh.project.board.model.dto");
		sessionFactoryBean.setTypeAliasesPackage("edu.kh.project.member.model.dto");
		
		//마이바티스 설정 파일 경로 지정
		sessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
		
		//SqlSession 객체 반환
		return sessionFactoryBean.getObject();
	}
	
	//SqlSessionTemplate : 기본 SQL 실행 + 트랜잭션 처리
	@Bean
	public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sessionFactory) {
		return new SqlSessionTemplate(sessionFactory);
	}
	
	//DataSourceTransactionManager : 트랜잭션 매니저
	@Bean
	public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}
	
	
}


-> 로그에 오류가 뜨지 않으면 성공!


암호화 설정

build.gradle

SecurityConfig.java

package edu.kh.project.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
//@EnableWebSecurity     // 해당 어노테이션 작성 시, 보안 화면 뜸.
public class SecurityConfig {

	@Bean
	public BCryptPasswordEncoder bCryptPasswordEncoder() {
		return new BCryptPasswordEncoder();
	}
}

BoardProjectBootApplication.java

package edu.kh.project;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
						// 보안 관련된 자동 설정 사용 X   // 해당 exclude 미작성 시, 보안 화면 뜸.
@SpringBootApplication(exclude = SecurityAutoConfiguration.class) // Spring Boot Application을 만들고, 수행하는데 필요한
						// 필수 어노테이션을 모아둔 (최상위) 어노테이션
public class BoardProjectBootApplication {

	public static void main(String[] args) {
		SpringApplication.run(BoardProjectBootApplication.class, args);
	}

}

0개의 댓글