[Spring] 예제1 - DB 연동 (Mybatis 설정 및 사용법), 회원가입 로직 작성
회원 가입 기능을 구현하려면 회원 정보를 추가하는 메서드가 제대로 작동되어야 한다.
회원 정보를 추가하려면 DB를 연동하는 작업이 우선 필요한데 Mybatis를 이용하여 이 작업을 해결한다.
Mybatis 라이브러리 불러오기
mybatis는 스프링 프레임워크에 포함되어 있지 않아 사용하려면 라이브러리를 따로 추가하여야 한다.
→ pom.xml에 mybatis 라이브러리를 추가하여야 한다.
(pom.xml: 외부 라이브러리 의존 관리 담당)
✍ pom.xml
아래 코드 복사, 붙여넣기 수행
<!-- Mybatis 관련 라이브러리 추가.. -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
✍ pom.xml 상태
<dependencies>
<!-- ja : 추가 라이브러리 시작-->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>21.8.0.0</version>
</dependency>
<!-- Mybatis 관련 라이브러리 추가.. -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- ja : 추가 라이브러리 끝 -->

mybatis 관련 라이브러리가 추가된 것을 확인할 수 있다.
참고로 라이브러리를 추가할 때 Tomcat 서버를 끈 상태로 추가하는 것이 좋다.
Mybatis 설정
✍ root-context.xml
코드 수정
<context:component-scan base-package="com.ja.finalproject.*.service" />
아래 코드 추가
<!-- ja : mybatis 설정 -->
<!-- DataSource 인스턴스 생성 및 등록 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
<property name="username" value="c##scott"></property>
<property name="password" value="tiger"></property>
</bean>
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
첫번 째 bean은 DBCP 빈이다.
localhost: ip 주소
1521: 포트번호
xe: 데이터베이스명

namespaces 탭 클릭 - mybatis 항목 체크

인터페이스 생성할 패키지명 작성 코드 추가
<mybatis-spring:scan base-package="com.ja.finalproject.*.mapper"/>
xml 위치 잡아주는 코드 추가
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/**/*.xml"></property>
</bean>
classpath 항목 확인
- mapper라는 폴더 하위의 어떤 풀더여도 상관없다. 어떤 파일명이든 상관없다는 의미를 내포하는 코드 작성
이제 인터페이스 1개 , xml 1개 생성해주면 된다.
✍ root-context.xml 최종 코드
(아래 코드 복사 붙여넣기)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<context:component-scan base-package="com.ja.finalproject.*.service" />
<!-- ja : mybatis 설정 -->
<!-- DataSource 인스턴스 생성 및 등록 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
<property name="username" value="c##scott"></property>
<property name="password" value="tiger"></property>
</bean>
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/**/*.xml"></property>
</bean>
<mybatis-spring:scan base-package="com.ja.finalproject.*.mapper"/>
</beans>
DB 한글 insert 깨짐 방지 설정
✍ web.xml
아래 코드 복사
</web-app> 태그 위에 아래 코드 복사
<!-- ja : 필수 추가 -->
<!-- 필터 등록... -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web.xml 최종 코드
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- ja : 필수 추가 -->
<!-- 필터 등록... -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
인터페이스 생성

✍ member.mapper\MemberSqlMapper.java (interface)
package com.ja.finalproject.member.mapper;
import com.ja.finalproject.dto.MemberDto;
public interface MemberSqlMapper {
public void insert(MemberDto memberDto);
}
mybatis는 일반적으로 mapper 방식을 사용한다.
mapper 하나 당 xml 하나를 만들어주어야한다.
MemberSqlMapper.xml 생성


~mapper.xml에 아래 코드 추가
✍ MemberSqlMapper.xml
<?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">
이제 인터페이스와 xml이 서로 mapping하는 태그가 필요하다.
(패키지명.인터페이스명까지 작성해주기)
<?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.ja.finalproject.member.mapper.MemberSqlMapper">
</mapper>
id에는 인터페이스에 있는 메서드명을 작성해야 한다. - 쿼리하고 인터페이스가 매핑될 것이다.
id - 메서드명 작성
insert 메서드가 호출되면 insert 태그에 있는 쿼리가 실행된다.
오라클은 보안상 세미콜론을 무조건 빼줘야 한다.
<?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.ja.finalproject.member.mapper.MemberSqlMapper">
<insert id="insert">
INSERT INTO fp_member VALUES(
fp_member_seq.nextval,
's98979',
'12345',
'한조3',
'M',
's00@gmail.com',
'01-01-01',
'010-1231-2312',
SYSDATE
)
</insert>
</mapper>
참고로, 작은 따옴표도 필요없음
주의 : 칼럼 순서 잘 맞추어야 한다.
코드 수정
<?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.ja.finalproject.member.mapper.MemberSqlMapper">
<insert id="insert">
INSERT INTO fp_member VALUES(
fp_member_seq.nextval,
#{user_id},
#{user_pw},
#{nickname},
#{gender},
#{email},
#{birth},
#{phone},
SYSDATE
)
</insert>
</mapper>
의존 주입
✍ MemberServiceImpl.java
서비스는 DB와 연동해야하므로 MemberSqlMapper를 의존 주입한다.
package com.ja.finalproject.member.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ja.finalproject.dto.MemberDto;
import com.ja.finalproject.member.mapper.MemberSqlMapper;
@Service
public class MemberServiceImpl {
@Autowired
private MemberSqlMapper memberSqlMapper;
public void register(MemberDto memberDto) {
System.out.println("여기서 알고리즘 수행");
memberSqlMapper.insert(memberDto);
}
}
회원가입 후 insert 확인

