prefix, suffix 설정은 application.properties에서
타임리프 문법
1) ${key} : 변수, Model 등으로 전달된 데이터의 key값 입력하면 value 출력
2) *{key} : 선택 변수, 객체에 포함된 필드 출력 -> th:object랑 같이 사용
3) th:text, th:value -> 지정된 내용을 text형식으로 내용, input의 value로 출력
4) th:text, th:utext
[[...]], [(...)] -> 텍스트 출력(HTML 태그의 해석 차이(각각 innerText, innerHTML과 비슷))
5) th:fragment="조각 이름"
6) th:insert="~{조각파일 경로 :: 조각이름}" -> 해당 조각 삽입
7) th:replace="~{조각파일 경로 :: 조각이름}" -> 해당 조각 교체
8) 조각이 없을 경우 -> th:replace="~{html 파일 경로}"
9) th:block : 유일한 자체 태그(마땅한 HTML태그 없을 때 사용, 다른 타임리프 수행 후 소멸)
10) th:if="${조건}", th:unless="${조건}" -> if, else : true,false 조건으로도 사용 가능
11) th:switch="${값}", th:case="${switch의 값 혹은 "*"}" -> "*"은 default
12) th:href = "@{url}", th:src = "@{url}", th:action = "@{url}" -> 경로에 대한 표현식
13) th:each="item : ${list}" -> 해당 요소를 list길이 만큼 반복
14) 비교연산자 : lt(<), gt(>), le(<=), ge(>=), eq(==), ne(!=), not(!)
15) 삼항연산자 : 조건식 ? true일때 반환값 : false일때 반환값
16) elvis 연산자 : 값 ?: 값이 없을때 반환값
17) No-operation 연산자 : 값 ?:_ -> 값이 없으면 html내부 태그 반환
18) script th:inline="javascript" : JS영역에서 타임리프 적용 해석
1) application.properties 설정
application.properties은 외부설정 파일(디폴트로 설정)
- 프로젝트 배포시 사용할 여러가지 설정 정의 -> 스프링이 자동으로 읽음
- 개발환경(dev.properties)과 운영환경(prod.properties)에 따라 나눌 수 있음
1-1) 오라클 DB와 연결 시킴
e.g.)
#오라클 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=비밀번호
# 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
1-2) HikariCP로 커넥션 풀 생성 및 설정
e.g.)
# HikariCP Connection Pool Properties
#풀이 연결을 사용할 수 있을 때까지 대기하는 최대 시간(밀리초)을 지정합니다.
spring.datasource.hikari.connection-timeout=30000
#풀의 최대 연결 수 설정
spring.datasource.hikari.maximum-pool-size=50
# 연결이 풀에서 유휴 상태로 있을 수 있는 최대 시간(밀리초)을 지정합니다.
spring.datasource.hikari.idle-timeout=600000
#연결 풀의 이름을 설정합니다.
spring.datasource.hikari.pool-name=MyHikariCP
2) @Configuration 클래스 파일을 이용
github에 계정, 암호 등이 업로드되는 문제 발생을 막기 위해 따로 생성하여 사용
2-1) 오라클 DB와 연결
e.g.)
#오라클 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=비밀번호
# 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
2-2) DBConfig클래스 생성하여 연결
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
@PropertySource("classpath:/config.properties")
public class DBConfig{
@Autowired
private ApplicationContext applicationContext;
// 어플리케이션 스코프 객체
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
// HikariConfig 객체를 만들어서 반환
}
@Bean
public DataSource dataSource(HikariConfig config) {
DataSource dataSource = new HikariDataSource(config);
return dataSource;
}
1) gradle에 dependency 추가
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2’
2) 마이바티스 설정 파일 생성
file 생성 -> mybatis-config.xml (위치는 src/main/resources)
<?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>
3) src/main/resources에 mappers 폴더 추가
4) DB연결도 2가지 방법으로 가능
4-1) application.properties에서 설정 (DB연결을 application.properties에서 연결한 경우만 가능)
### 마이바티스 설정 ###
#마이바티스 설정 파일 경로
mybatis.config-location=classpath:mybatis-config.xml
#매퍼 파일 경로
mybatis.mapper-locations=classpath:/mappers/**.xml
#별칭을 지정할 파일이 포함된 패키지
#콤마(,) 구분하여 여러 패키지 작성, 별칭은 클래스명의 소문자로 자동 지정
mybatis.type-aliases-package=edu.kh.project.member.model.dto
4-2) @Configuration 클래스 파일 이용 (DB연결을 DBConfig로 연결한 경우만 가능)
// 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");
// 마이바티스 설정 파일 경로 지정
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);
}