-----------------------------
-- 테이블: 게시판
-- 테이블ID: TB_BOARD
-----------------------------
CREATE TABLE TB_BOARD (
idx INT NOT NULL,
title VARCHAR2(100) NOT NULL,
content VARCHAR2(3000) NOT NULL,
writer VARCHAR2(20) NOT NULL,
view_cnt INT DEFAULT 0,
notice_yn char(1) CHECK(notice_yn IN ('N','Y')),
secret_yn char(1) CHECK(secret_yn IN ('N','Y')),
delete_yn char(1) CHECK(delete_yn IN ('N','Y')),
insert_time DATE DEFAULT sysdate,
update_time DATE NULL,
delete_time DATE NULL,
PRIMARY KEY (idx)
);
COMMENT ON TABLE TB_BOARD IS '게시판';
COMMENT ON COLUMN TB_BOARD.idx IS '번호(PK)';
COMMENT ON COLUMN TB_BOARD.title IS '제목';
COMMENT ON COLUMN TB_BOARD.content IS '내용';
COMMENT ON COLUMN TB_BOARD.writer IS '작성자';
COMMENT ON COLUMN TB_BOARD.view_cnt IS '조회수';
COMMENT ON COLUMN TB_BOARD.notice_yn IS '공지글 여부';
COMMENT ON COLUMN TB_BOARD.secret_yn IS '비밀글 여부';
COMMENT ON COLUMN TB_BOARD.delete_yn IS '삭제 여부';
COMMENT ON COLUMN TB_BOARD.insert_time IS '등록일';
COMMENT ON COLUMN TB_BOARD.update_time IS '수정일';
COMMENT ON COLUMN TB_BOARD.delete_time IS '삭제일';
CREATE SEQUENCE TB_BOARD_SEQ
START WITH 1
INCREMENT BY 1;
notice_yn char(4) CHECK(notice_yn IN ('N','Y'))
notice_ny에는 'N' 또는 'Y' 밖에 들어갈 수 없다.
XXX_yn char(4) -> char(1) 변경
삭제처리할 때,"N".equals(board.getXxxYn) = false
가 뜨는 현상이 일어나서 봤더니,
'N '으로 데이터가 삽입되어 있었다. char()는 크기가 고정적인 데이터타입이기 때문에 4Byte가 꽉 채워져서 들어간 것. 조심하자..!
src/main/resources/application.properties
HikariCP: DB와의 커넥션풀 관리를 해준다.
# HikariCP Datasource (Oracle)
spring.datasource.hikari.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@localhost:1521/orcl
spring.datasource.hikari.username=c##username
spring.datasource.hikari.password=password
spring.datasource.hikari.connection-test-query=SELECT SYSDATE FROM dual
# MyBatis
# 자바 변수는 noticeYn, 컬럼은 notice_yn이다.
# 구분되는 단어의 앞 글자만 대문자로 처리하는 카멜케이스 설정을 해서, 자동 매핑되도록 함.
mybatis.configuration.map-underscore-to-camel-case=true
<?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="com.board.mapper.BoardMapper">
<sql id="boardColumns">
idx
, title
, content
, writer
, view_cnt
, notice_yn
, secret_yn
, delete_yn
, insert_time
, update_time
, delete_time
</sql>
<insert id="insertBoard" parameterType="BoardDTO">
insert into TB_BOARD (
<include refid="boardColumns" />
) values (
TB_BOARD_SEQ.NEXTVAL
, #{title}
, #{content}
, #{writer}
, 0
, NVL(#{noticeYn, jdbcType=VARCHAR}, 'N')
, NVL(#{secretYn, jdbcType=VARCHAR}, 'N')
, 'N'
, sysdate
, null
, null
)
</insert>
</mapper>
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 에러가 일어날 경우
<mapper namespace="com.board.mapper.BoardMapper">
이 부분 제대로 됐는지 확인. 마이바티스로 바로 xml 생성하고 쿼리 작성했더니, 저부분이 수정 안돼서 오류가 났었음.
import org.apache.ibatis.annotations.Mapper;
import com.board.domain.BoardDTO;
@Mapper
public interface BoardMapper {
// 게시글 생성
public int insertBoard(BoardDTO params);
}
5.src/main/java/com/board/configuration/DBConfiguration.java
@Configuration
@PropertySource("classpath:/application.properties")
public class DBConfiguration {
@Autowired
private ApplicationContext applicationContext;
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}
@Bean
public DataSource dataSource() {
return new HikariDataSource(hikariConfig());
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
factoryBean.setMapperLocations(applicationContext.getResources("classpath:/mappers/**/*Mapper.xml"));
factoryBean.setTypeAliasesPackage("com.board.domain");
factoryBean.setConfiguration(mybatisConfg());
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSession() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory());
}
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration")
public org.apache.ibatis.session.Configuration mybatisConfg() {
return new org.apache.ibatis.session.Configuration();
}
}
애너테이션 | 설명 |
---|---|
@Configuration | 자바 기반 설정파일로 인식 |
@PropertySource | 해당 클래스에서 참조할 properties 파일의 위치를 지정 |
@Autowired | 객체 주입 |
@Bean | Configuration 클래스의 메서드 레벨에만 지정이 가능하며, 오브젝트를 만들어주는 메소드 |
@ConfigurationProperties | 설정을 외부화할 때 사용. prefix 값으로 프로퍼티를 구분하여 클래스를 만들어 @ConfigurationProperties 어노테이션을 사용하여 프로퍼티 값을 사용하는 것이 매핑도 유연하게 할 수 있다는 장점이 있다. |
메서드 | 설명 |
---|---|
ApplicationContext | 스프링에서는 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 빈(bean) 이라고 부른다. 자바 빈 또는 엔터프라이즈 자바빈에서 말하는 빈과 비슷한 오브젝트 단위의 애플리케이션 컴포넌트를 말한다. 동시에 스프링 빈은 스프링 컨테이너가 생성과 관계 설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 말이다. |
hikariConfig | hikariCP 객체 생성 |
dataSource | 데이터 소스 객체 생성. 데이터 소스는 커넥션 풀을 지원하기 위한 인터페이스.(커넥션 풀은 커넥션 객체를 생성해두고, 데이터베이스에 접근하는 사용자에게 미리 생성해둔 커넥션을 제공했다가 다시 돌려받는 방법) |
sqlSessionFactory | SqlSessionFactory 객체 생성. SqlSessionFactoryBean은 마이바티스와 스프링의 연동 모듈로 사용. 마이바티스 XML Mapper, 설정 파일 위치 등을 지정하고,SqlSessionFactoryBean 자체가 아닌, getObject 메서드가 리턴하는 SqlSessionFactory를 생성. |
sqlSession | sqlSession 객체 생성. |
setMapperLocations | getResources 메서드의 인자로 지정된 패턴에 포함되는 XML Mapper를 인식하도록 하는 역할. |
setTypeAliasesPackage | BoardMapper XML에서 parameterType과 resultType은 클래스의 풀 패키지 경로가 포함되어야 합니다. BoardDTO와 같이 클래스의 이름만 지정하였는데요, 해당 메서드를 사용해서 풀 패키지 경로를 생략할 수 있습니다. 패키지의 패턴이 복잡하다면, com.board..domain과 같이 전체를 의미하는 애스터리스크("")를 지정할 수 있습니다. |
mybatisConfig | application.properties에서 mybatis.configuration으로 시작하는 모든 설정을 읽어 들여 빈(Bean)으로 등록 |
setConfiguration | 마이바티스 설정과 관련된 빈(Bean)을 설정 파일로 지정 |
src/text/java/com/board/MapperTests.java
에 테스트코드 작성package com.board;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.board.domain.BoardDTO;
import com.board.mapper.BoardMapper;
@SpringBootTest
class MapperTests {
@Autowired
private BoardMapper boardMapper;
@Test
public void testOfInsert() {
BoardDTO params = new BoardDTO();
params.setTitle("게시글 제목 테스트1");
params.setContent("게시글 내용 테스트2");
params.setWriter("테스트계정1");
int result = boardMapper.insertBoard(params);
System.out.println("결과는 " + result + "입니다.");
}
}
https://www.oracle.com/database/technologies/appdev/jdbc-ucp-19-7-c-downloads.html
에서 orai18n.jar
저장orai18n.jar
선택