Back-End/Spring

[Spring] 예제1 - DB 연동 (Mybatis 설정 및 사용법), 회원가입 로직 작성

09009 2023. 5. 16. 10:50

회원 가입 기능을 구현하려면 회원 정보를 추가하는 메서드가 제대로 작동되어야 한다.

회원 정보를 추가하려면 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 확인