Spring Boot To do List_00 프로젝트 생성, 세팅

송지윤·2024년 4월 11일
0

Spring Framework

목록 보기
16/65
post-thumbnail

프로젝트 생성

Spring Starter Project

의존성 모듈 추가하는 부분

dependencies 모듈, 라이브러리 추가
JDBC API, Oracle Driver, Mybatis Framework

MyBatis

JDBC 프레임 워크 (하나의 정형화된 틀)

CRUD
Create 생성
Read 조회
Update 수정
Delete 삭제
=> 자주해야하는 일

쉽게 하려고 SQL 수행 JDBC 코드 짧게 쓰고 쉽게 쓰기위해 사용하는 게 MyBatis
MyBatis -> XML 파일 형태 많이 사용 (JDBC와 비슷함)

http://www.mybatis.org/mybatis-3/ko

공식홈페이지

Service 단에서 Connection 제어 및 Commit Rollback 안 함

SqlSession => Connection + MyBatis

SqlSession 이 실행되는 과정

Mybatis 동작 원리

공장 가동되려면 객체 형태로 돼있어야함
Factory Bean -> Spring이 생성 + 관리
내부 설정들 작성해놓은 파일 => mybatis-config.xml
mybatis-config.xml 직접 만들어서 설정들 작성할 거
=> 토대로 SqlSession Factory Bean 생성됨
공장에서 SqlSession Template 만듦
SqlSession + 트랜잭션
mapper.xml 안에 sql 쿼리문들 다 써놓을 것(sql 모음)
이걸 읽어와서 selectOne selectList selectMap insert update delete 메서드들을 이용해서 sql문을 실행시킬 수 있음

STS4 에서 xml 사용하려면 MarketPlace 이용해야함

MarketPlace (sts4에서 xml 사용위해 필요)

Help -> Eclipse Marketplace -> xml enter -> Eclipse XML Editors and Tools 3.33 Install 클릭

-> confirm -> accept 체크 -> Finish

XML 파일 DTD 추가 (Mybatis 이용하기 위해)

Document Type Definition
마이바티스에서 사용하기 위한 xml 파일

window -> preferences -> xml -> xml catalog -> User Specified Entries 클릭 -> Add 클릭 ->

  1. config
    Location에 http://mybatis.org/dtd/mybatis-3-config.dtd
    Key에 -//mybatis.org//DTD Config 3.0//EN

  2. mapper
    http://mybatis.org/dtd/mybatis-3-mapper.dtd
    -//mybatis.org//DTD Mapper 3.0//EN

-> Apply and Close

DTD 설정 중 하나 불러서 xml 파일 만들 수 있음

mybatis-config.xml 생성

src/main/resources 에 mybatis-config.xml 만듦

config 설정 파일용 xml 만들 때 사용

mybatis-config.xml 생성 후 빨간 줄 발생시

window -> preferences -> XML (Wild Web Developer) -> Download external ~ 체크 -> Apply and Close

mybatis-config.xml 설정 Setting

ctrl + c ctrl + v

<?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>
		<!-- Java -> DB로 INSERT,UPDATE 시 Java의 null 값을 DB의 NULL로 인식하도록 설정-->
		<setting name="jdbcTypeForNull" value="NULL" />
		
		<!-- DB의 UnderScore (_) 표기법 <-> Java의 Camel 표기법
			두 표기법이 서로 변환 될 수 있도록 매핑하여
			Java 필드명(memberId)과 DB 컬럼명(MEMBER_ID)가 서로 연결되게 함
		-->
		<setting name="mapUnderscoreToCamelCase" value="true" />
	</settings>
</configuration>

java 에서 null == 참조하는 게 없다
db 에서 null == 값 자체가 없다

mapper.xml 파일 생성

src/main/resources 에 mappers 폴더 만들고 그 안에 mapper.xml 만들어줌

mapper.xml

mapper 태그에 namespace 필수 작성

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="Mapper 인터페이스 경로 작성(필수)">
	<!-- 아래 태그는 만들자마자 삭제해야함 삭제 안하면 오류 발생 -->
	<!-- <cache-ref namespace=""/> -->
</mapper>

DB 연결하기

Spring 과 Mybatis 연결해서 사용할 수 있게 해줄 거

HikariCP

Hikari Connection Pool
Connection : DB 연결 정보를 담고있는 객체
getConnection oracle 정보 db driver 등등 담아뒀음
(이게 있어야 JDBC 수행 가능)
Pool : 웅덩이, 수영장 (모여있는 곳)

Connection Pool : Connection이 모여있는 곳

servlet -> service(getConnection == 커넥션 생성) -> dao 호출 하고 다시 돌아감
service 단에서 connection close 하고 반환

요청 올 때마다 생성하고 닫고 반복했었음

connection pool 은 빌려줬다가 가져감

Connection Pool

Server 실행 시 DB와 연결된 Connection을 일정 개수 생성 -> 클라이언트 요청 시 만들어진 Connection 대여 -> 요청이 처리 완료되면 다시 Connection 반납 받음

=> 생성/소멸(반환) 걸리는 시간이 현격히 감소

대기열 세워둘 수 있음 + DB 연결 과부하 예방

JDBC 이용하려면 JDBC API 필요
프로젝트 만들 때 JDBC API 추가해뒀음
ORACLE Driver 도 추가해뒀음

DB 연결 시 @ConfigurationProperties 어노테이션 사용하는데 configuration-processor 필요함 프로젝트 생성시 추가해뒀음

config.properties 파일 생성 ctrl + c ctrl + v

src/main/resources 폴더 안에 config.properties 파일 생성
(application.properties 와 동일 선상에 존재)

config.properties 파일 우클릭 Properties -> Other UTF-8 설정

안해주면 한글 다 깨져서 들어옴

save as UTF-8

오라클 DB 연결 정보들 넣어둘 거임
application.properties 아닌 config.properties 생성하는 이유
연결 정보 다 올려두고 안에 내용으로 DB 연결
github에 안 올리려고 (보안문제)
application.properties 는 없으면 안돼서 github 안 올릴 수 없음

config.properties 안에 넣을 내용

#오라클 DB 연결 정보
spring.datasource.hikari.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@IP주소:포트번호:DB이름
spring.datasource.hikari.username=계정명
spring.datasource.hikari.password=비밀번호

Connection Pool에 관한 설정들

# HikariCP Connection Pool Properties
#풀이 연결을 사용할 수 있을 때까지 대기하는 최대 시간(ms)을 지정
spring.datasource.hikari.connection-timeout=30000
#풀의 최대 연결 수 설정
spring.datasource.hikari.maximum-pool-size=50
#연결이 풀에서 유휴 상태로 있을 수 있는 최대 시간(ms)을 지정
spring.datasource.hikari.idle-timeout=600000
#연결 풀의 이름을 지정
spring.datasource.hikari.pool-name=MyHikariCP
#자동 커밋 끄기
spring.datasource.hikari.auto-commit=false

.gitignore 파일에 config.properties 넣어두면 git에 올라가지 않음

DBConfig 파일 생성 ctrl c ctrl v

package com.home.todo.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
 * - 설정용 클래스임 명시
 * + 객체로 생성해서 내부 코드를 서버 실행시 모두 수행 (설정 내용 토대로 DB 연결)
 * 
 * @PropertySource("classpath:/config.properties")
 * classpath == src/main/resources
 * config.properties 파일을 읽어와서 DBConfig 클래스에서 사용하겠다는 어노테이션
 * 
 * @PropertySource("경로")
 * - 지정된 경로의 properties 파일 내용을 읽어와 사용
 * - 사용할 properties 파일이 다수일 경우
 *   해당 어노테이션을 연속해서 작성하면 됨
 *   
 * @ConfigurationProperties(prefix="spring.datasource.hikari")
 * - @PropertySource 로 읽어온 properties 파일의 내용 중
 *   접두사 (앞부분, prefix)가 일치하는 값만 읽어옴
 *   
 * @Bean
 * - 개발자가 수동으로 생성한 객체의 관리를
 *   스프링에게 넘기는 어노테이션
 *   (Bean 등록)
 *   
 * DataSource : Connection 생성 + Connection Pool 지원하는 객체를
 *              참조하기 위한 Java 인터페이스
 *              (DriverManager 대안, Java JNDI 기술 이용)
 *              
 * @Autowired
 * - 등록된 Bean 중에서 타입이 일치하거나, 상속관계에 있는 Bean 을
 *   지정된 필드에 주입
 *   == 의존성 주입(DI, Dependency Injection, IOC 관련 기술)
 * */

@Configuration // 설정용 클래스임을 명시한 어노테이션
@PropertySource("classpath:/config.properties")
public class DBConfig {

	// 필드
	
	// org.springframework.context.ApplicationContext;
	
	@Autowired // (DI, 의존성 주입)
	private ApplicationContext applicationContext; // application scope 객체 : 즉, 현재 프로젝트
	// 이미 Spring이 ApplicationContext를 Bean 으로 관리하고 있어서 @Autowired 로 연결해주기만 하면 됨
	
	// ************* HikariCP 설정 (2가지) *************
	
	@Bean
	@ConfigurationProperties(prefix="spring.datasource.hikari")
	public HikariConfig hikariConfig() {
		/* @ConfigurationProperties 이 어노테이션은
		 * DBConfig 클래스에 있는 @PropertySource 이 어노테이션과 연계됨
		 * 
		 * config.properties 파일 안에 접두사가 spring.datasource.hikari 인 것들을
		 * 전부 불러와 HikariConfig 객체 생성하겠다는 것
		 * 
		 * config.properties 에 담긴 정보들을 이용해서 Connection 을 만들겠다는 것
		 * 
		 * 객체를 만들어서 반환 Spring 이 관리 @Bean 추가
		 * */
		return new HikariConfig();
	}
	
	// 만들어진 HikariConfig 이용해서 datasource 만들 거
	
	@Bean
	public DataSource dataSource(HikariConfig config) {
		/* HikariConfig 이용해서 만들 거 위에 만들어놓은 HikariConfig가
		 * 자동으로 매개변수로 들어와서 연결됨
		 * 
		 * 매개변수 HikariConfig config
		 * -> 등록된 Bean 중 HikariConfig 타입의 Bean 이 Spring 에 의해서 자동으로 주입
		 * 
		 * config.properties 설정 내용 + HikariCP 로 HikariDataSource 생성
		 * 
		 * DataSource 는 interface 형식으로 상속받은 자식들이 대입하는 형태로 객체화
		 * */
		
		DataSource dataSource = new HikariDataSource(config);
		
		return dataSource;
	}
	
	// ************* Mybatis 설정 *************
	
	// SqlSession -> Mybatis 를 지원하는 객체
	
	@Bean
	public SqlSessionFactory sessionFactory(DataSource dataSource) throws Exception {
		/* Mybatis 를 쓸 수 있게 해주는 객체
		 * Bean 으로 만들려면 DataSource 필요
		 * */
		
		SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
		
		sessionFactoryBean.setDataSource(dataSource);
		
		// mapper.xml(SQL) 파일이 모이는 경로 지정
		// -> Mybatis 코드 수행 시 mapper.xml을 읽을 수 있음
		// sessionFactoryBean.serMapperLocations("현재프로젝트.자원.어떤파일");
		
		// DBConfig 필드 부분에 현재프로젝트를 선언해둘 거
		
		sessionFactoryBean.setMapperLocations(
					applicationContext.getResources("classpath:/mappers/**.xml") );
		// .xml 로 끝나는 모든 파일의 SQL 을 모아서 세팅을 해준다는 거
		
		// 해당 패키지 내 모든 클래스의 별칭을 등록
		// Mybatis 이용할 때 패키지명.클래스명 이렇게 불러야하는데 별칭 등록해서
		// 짧게 불러서 쓰려고 하는 설정
		
		/* Mybatis 는 특정 클래스 지정 시 패키지명.클래스명을 모두 작성해야함
		 * 너무 길어서 짧게 부를 별칭을 설정
		 * 
		 * setTypeAliasesPackage("패키지") 이용 시
		 * 클래스 파일명이 별칭으로 등록됨
		 * 
		 * ex) com.home.todo.model.dto.Todo --> Todo 로만 부를 수 있음
		 * 별칭 등록으로 클래스명으로 짧게 부를 수 있음
		 * */
		sessionFactoryBean.setTypeAliasesPackage("com.home.todo");
		
		
		// mybatis 설정 파일 경로 지정 mybatis-config.xml 파일에 setting 만 해두고 연결 X
		// sessionFactoryBean 에 연결
		sessionFactoryBean.setConfigLocation(
					applicationContext.getResource("classpath:/mybatis-config.xml") );
		
		// 설정 내용이 모두 적용된 객체 반환
		return sessionFactoryBean.getObject();
		
	}
	
	// SqlSessionTemplate : Connection + DBCP + Mybatis + 트랜잭션 제어 처리
	
	@Bean
	public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sessionFactory) {
	return new SqlSessionTemplate(sessionFactory);
	}
	
	// DataSourceTransactionManager : 트랜잭션 매니저(제어 처리)
	
	@Bean
	public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
	return new DataSourceTransactionManager(dataSource);
	}
}

0개의 댓글