[21.10.15] MyBatis 설정

yed·2021년 10월 15일
0

메소드를 먼저 만들고 어노테이션을 쓰자

@GetMapping("/product2")
public String product2(@ModelAttribute(name="vo") ProductVO vo) {
	LOGGER.info("product2() 호출");
	return "product-result";
}

@modelAttribute()를 쓰면 ProductVO vo=new ProductVO(name, price);를 안해도 부를때마다 객체를 생성함. 매개변수있는 생성자 호출
스프링에서는 클라이언트에서 보내는 parameter 이름과 vo의 변수명은 모두 똑같아야한다.
싱글톤형태는 아님. 데이터가 갱신이 되어야해서 객체를 생성하는것.

데이터를 클라이언트에서 서버로 보내는 방식은 parameter뿐만 아니라 json형태로도 가능하다.

@ResponseBody

스프링에서 json형태로 데이터를 전송할 때 사용하는 어노테이션.

@GetMapping("/json2")
@ResponseBody
public String json2() {
	LOGGER.info("json2() 호출");
	return "Hello, Spring";
}

지금까진 return 값이 jsp를 돌려주면서 jsp파일을 호출했는데 @ResponseBody를 사용하면 jsp파일이 호출되는게 아니라 String 값을 돌려주는 것.

ajax 비동기방식에 데이터만 돌려줄 때 주로 사용된다.

@GetMapping("/json3")
@ResponseBody
public ProductVO json3() {
	LOGGER.info("json3() 호출");
	return new ProductVO("야구공", 10000);
}

vo를 return하게 되면 {"name":"야구공","price":10000}형태의 데이터가 프론트사이드에 전송된다
자동으로 json의 key-value형태로 파싱되어 전송됨.


MVC 동작순서

  • Model은 front Controller에서 view와 controller를 왔다갔다할 수 있게 함.
  • mapper와 mybatis는 db와 controller가 쉽게 연결할수있도록 도와줌

스프링 MVC는 웹애플리케이션을 쉽고 빠르게 개발할 수있도록 도와준다.

xml, jsp, java 등 프로젝트 안에있는 모든 소스파일들은 전부 bytecode로 바뀌어서 구동된다.
그래서 xml에서 하던 설정이 java에서도 설정할 수 있고 왔다갔다가 가능함
그냥 구역을 나누어놓은 약속일뿐

MyBatis 설정하기

  • 데이터베이스 연동을 위한 프레임워크
  • XML을 사용한 SQL문 설정과 처리 기능 제공
  • 어노테이션 지원 - 어노테이션과 인터페이스를 통한 SQL문 설정과 처리

새로운 프로젝트를 만들었다면 pom.xml->web.xml->root-context.xml->servlet-context.xml 순으로 설정 적용해주기

pom.xml에서 라이브러리 적용하기

pom.xml에서 버전을 변경했는데 maven에 적용되지않았다면
프로젝트->maven->update project

pom.xml의 버전 변경 따라하기

추가적인 라이브러리

  • jdbc 라이브러리
<!-- jdbc 라이브러리 -->
<dependency>
	<groupId>com.oracle</groupId>
	<artifactId>ojdbc6</artifactId>
	<version>11.2.0</version>
</dependency>
  • MyBatis 라이브러리
<!-- MyBatis 라이브러리 -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.4.4</version>
</dependency>

mybatis-spring 라이브러리

<!-- mybatis-spring 라이브러리 -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>1.3.1</version>
</dependency>

spring-jdbc 라이브러리

<!-- spring-jdbc 라이브러리 -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

설정을 다 했는데 404가 뜬 경우
1. 프로젝트가 서버에 add되어있는지 확인하기

root-context.xml 설정 변경하기

root-context.xml에서 <beans>는 설정관련된 것을 모아놓은 객체라고 볼 수 있다.

  • 기존의 <beans> 덮어쓰기
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
  • <bean> 추가하기 - DataSource 설정
<bean id="ds" class="oracle.jdbc.pool.OracleDataSource"	destroy-method="close">
	<property name="dataSourceName" value="ds"></property>
	<property name="URL" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
	<property name="user" value="scott"></property>
	<property name="password" value="tiger"></property>
</bean>
  • <bean> 추가하기 - SqlSessionFactory 설정
    value값에 있는 classpathsrc/main/resources를 의미한다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="ds" />
	<property name="configLocation" value="classpath:/mybatis-config.xml" />
	<property name="mapperLocations" value="classpath:mappers/*.xml" />
</bean>
  1. src/main/resources에서 mybatis-config.xml 파일 생성.
    기존에 java에서 사용한 db관련 상수들을 이 파일에서 매핑한다.
<?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>
	<!-- DB 테이블과 컬럼들을 mapper 매핑을 위한 변수 선언 -->
</configuration>  
  1. mappers 폴더 생성하고 프로젝트 관련 xml파일 만들기
    나는 게시판을 만들 예정이기때문에 board-mapper.xml생성. 여기에는 쿼리랑 controller나 bean같은 전체적인 객체를 설정한다.
<?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="edu.spring.ex02.BoardMapper"></mapper>

namespace : 주로 DAO 클래스의 sqlSession과 연결하기 위한 키로 사용함

  • <bean> 추가하기 - SqlSession 설정
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
	<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
  • base-package 밑의 클래스들 중에서 @Component로 등록된 클래스들을 bean으로 생성해서 관리함.
    서버가 시작하면서 설정관련 필수 정보들을 올려놓는 것.
    Persistence/Service Layer의 컴포넌트 클래스들을 bean으로 등록함
<context:component-scan base-package="edu.spring.ex02"></context:component-scan>

trigger가 사용되는 순간

  1. 댓글 테이블과 게시판 테이블이 있으면 댓글테이블에 데이터가 추가될 경우 게시판 테이블의 댓글수 컬럼도 자동으로 숫자가 변경되어야함.

  2. 데이터 insert 시 연결된 시퀀스가 쿼리에 nextval을 포함하지 않아도 자동으로 시퀀스가 수행되게함.

이런 데이터 연결을 자동으로 해주는게 트리거. 트리거를 쓰면 약간의 시간차이가 있을 수 있다

  • 2번의 경우
create or replace trigger test_board_bno_trigger
before insert on test_board
for each row
begin
    select test_board_seq.nextval into :new.bno from dual;
end;
  • 데이터 중 title과 content를 수정했을 때 날짜 cdate컬럼도 데이터가 수정된 시각으로 변경되게끔 트리거 작성
create or replace trigger test_board_cdate_trigger
before update of title, content on test_board
for each row
begin
    select sysdate into :new.cdate from dual;
end;

mybatis-config.xml

DB테이블과 컬럼명이랑 매핑하여 사용하기 위해 변수를 선언함

property

  • name : mapper.xml에서 사용될 이름
  • value : DB 테이블 및 컬럼 이름
<properties>
	 <property name="test_board" value="test_board"/>
	 <property name="bno" value="bno"/>
	 <property name="title" value="title"/>
	 <property name="content" value="content"/>
	 <property name="userid" value="userid"/>
	 <property name="cdate" value="cdate"/>
	 <property name="reply_count" value="reply_count"/>
</properties>

mapper 폴더

mapper안에는 DB쿼리 작성

  • id : 주로 DAO 클래스의 sqlSession의 함수와 연결하기 위해 사용함. 1:1 매칭

  • ${key 이름} : mybatis-config.xml의 property의 name과 매칭된다. DB 테이블의 열에 해당.

  • #{key 이름} : DAO 클래스의 sqlSession에서 전송받은 데이터를 의미한다.(입력데이터 쿼리의 ?부분)
    VO에서 getter/setter를 사용해서 데이터를 가져온다.

VO랑 DB의 이름을 연결해주기 위해서 사용하는 key 이름

  • mapper 태그 : <insert>, <select>, <update>, <delete>
    DAO에서 사용하는 sqlSession의 함수(insert, selectOne, selectList, update, delete)에 맞춰 수행됨.

다음주 예고
단위 테스트. 서버가 없어도 Mapper-MyBatis ↔ DB 간의 동작을 테스트할 수 있음...

spring으로 mvc 게시판을 만들어보기 위한 대장정..🤪

profile
6개월 국비과정 기록하기

0개의 댓글