JAVA

[spring] spring-boot : MVC 어노테이션(Mapper,Repository,Service,Controller)

docc 2021. 8. 16. 18:20

Model: controller, Service, Mapper/Repository 와의 상호 작용

RestController : Service와 상호작용

Service: Mapper, Reopstiory와 상호작용

Mapper/Reopstiory: SqlSesion 및 DB와 상호작용

 

Mapper / Repository

  • Mybatis를 사용하여 데이터를 처리하는 부분입니다. (+xml 사용)
  • Mapper 어노테이션을 사용하여 xml에 namespace와 매핑, 메서드의 명과 xml에 각 id와 매핑시킴
  • Repostiory 어노테이션을 사용하여 Service나 Controller 에서 DI 될 수 있도록 한다. 

프로젝트명: memboard
package: com.example.memboard


1. pom.xml


라이브러리 넣기

el, jstl, servlet

		<!-- 톰캣파서 -->
		<dependency> 
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>
    
		<!-- jstl 라이브러리 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>

 		<!-- tomcat -->
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-annotations-api</artifactId>
			<version>${tomcat.version}</version>
		</dependency>
 	
		<!--tomcat-jsp-api-->
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jsp-api</artifactId>
			<version>${tomcat.version}</version>
		</dependency>

		<!--tomcat-embed-el-->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-el</artifactId>
			<version>${tomcat.version}</version>
		</dependency>

		<!--javax.servlet.jsp.jstl-api-->
		<dependency>
			<groupId>javax.servlet.jsp.jstl</groupId>
			<artifactId>javax.servlet.jsp.jstl-api</artifactId>
		 	<version>1.2.1</version>
		</dependency>
   
	
		<!-- tomcat-jdbc -->
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jdbc</artifactId>
			<version>${tomcat.version}</version>
		</dependency>
  

		<!--tomcat-embed-core-->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-core</artifactId>
			<version>${tomcat.version}</version>
		</dependency>


		<!-- tomcat-embed-jasper -->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<version>${tomcat.version}</version>
		</dependency> 

		<!--JDBC -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-jdbc</artifactId>
		    <version>1.4.1.RELEASE</version>
		</dependency>

		<!--MyBatis -->
		<dependency>
		    <groupId>org.mybatis.spring.boot</groupId>
		    <artifactId>mybatis-spring-boot-starter</artifactId>
		    <version>1.1.1</version>
		</dependency>

		<!-- mybatis-spring -->                
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>1.3.0</version>
		</dependency>
        
		<!-- mybatis -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.4.2</version>
		</dependency>

spring-boot pom 예외사항

C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext

해당 폴더에 추가한 lib 은 충돌이 나므로 pom 에 추가하지 말아야 한다.

mysql-connector 은 이미 java 에 추가했으므로 pom 에 넣지 않아야 한다.!

 

        <!-- MYSQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

 

 

 

2. application.property


spring-boot 에는 따로 root-context 나 application-context 가 없다.

root-context = 주로 DB 설정함(SqlFactory 등등)
application-context = tiles.xml 경로,클래스,순서 설정했었음

 

이 프로퍼티가 그 역할을 한다.

server.port:8989 #tomcat 이 Servers 항목에 따로 없고 여기에서 설정해야함.
spring.mvc.view.prefix=/WEB-INF/views
spring.mvc.view.suffix=.jsp
#주석이며 실제로는 엔터로 공백만들면 안된다.
spring.datasource.driver-class-name=com.mysql.jdbc.Driver #Datasource 설정
spring.datasource.url=jdbc:mysql://localhost:3306/ch20
spring.datasource.username=root
spring.datasource.password=12345

 

 

 

3. MemboardApplication.java


기본 클래스(프로젝트명+Application 으로 자동생성됨)

경로: com.example.memboard

작업: MyBatis 사용 코딩, SqlSessionFactory 빈 생성(위에서 설정한 Datasource를 이용)

@Bean: 스프링에 필요한 객체를 생성
sqlSessionFactory() : MyBatis 의 sqlSessionFactory 를 반환한다.
스프링부트가 실행될 때 dataSource 객체를 이 메서드 실행시 주입해서 결과를 만들고
그 결과를 스프링내 빈으로 사용하게 된다.
package com.example.memboard;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;

@SpringBootApplication
public class MemboardApplication {

	public static void main(String[] args) {
		SpringApplication.run(MemboardApplication.class, args);
	}//main-end
	
	//SqlSessionFactory 설정
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource)throws Exception{
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource);
		
		return sqlSessionFactoryBean.getObject();
	}

}

 

 

 

4. MemberVO.java or MemberDTO.java


경로(패키지): com.example.memboard.dto

public class MemberDTO {
	private String id;
	private String pw;
	private String name;
	
	private String email;
	private String tel;
	
	private String zipcode;
	private String addr;
	private String addr2;
	
	private Date regdate;
	
	public MemberDTO() {
	}

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
    //getter,setter생략
}

 

 

 

5. Interface


5-1. MemberMapper.java

매퍼 연결의 인터페이스(연결) 역할

@Repository : DAO 임을 알림, 고유id역할

@Mapper : Mapper 의 인터페이스로 사용될 예정

package com.example.memboard.mapper;

import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;

import java.util.*;
import com.example.memboard.dto.MemberDTO;
//@Repository("com.example.memboard.mapper.MemberMapper")
//해당 클래스가 데이터페이스에 접근하는 클래스임을 명시한다.

//@Mapper
//


//인터페이스
@Repository("com.example.memboard.mapper.MemberMapper")
@Mapper
public interface MemberMapper {

	//id 중복체크, 내 정보 수정
	public MemberDTO selectOne(String id) throws Exception;
	
	//회원가입
	public void insertMember(MemberDTO memberDTO) throws Exception;
	
	//로그인
	public MemberDTO selectLogin(Map map) throws Exception;
	
	//DB에 내 정보 수정
	public void memberUpdate(MemberDTO memberDTO) throws Exception;
	
	//탈퇴
	public void memberDelete(String id) throws Exception;
}

 

 

5-2. MemberMapper.xml 

 

위의 인터페이스 구현, 같은 패키지에 있어야 한다. ( 인터페이스를 상속하는 클래스처럼 )

namespace 속성 : 구현할 인터페이스의 풀네임(패키지+클래스명)

id 속성(CRUD태그) : 구현할 인터페이스내의 메서드명

<?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.example.memboard.mapper.MemberMapper">
	<!-- id중복 체크, 내 정보 수정 -->
	<select id="selectOne" parameterType="String" resultType="com.example.memboard.dto.MemberDTO">
		select * from member where id=#{id}
	</select>

	<!-- 회원가입 -->
	<insert id="insertMember">
		insert into member(id,pw,name,email,tel,zipcode,addr,addr2,regdate)
		values(#{id},#{pw},#{name},#{email},#{tel},#{zipcode},#{addr},#{addr2},NOW())
	</insert>
	
	<!-- 로그인 -->
	<select id="selectLogin" parameterType="map" resultType="com.example.memboard.dto.MemberDTO">
		select * from member
		where id=#{id} and pw=#{pw}
	</select>
	
	<!-- DB에 내 정보 수정 -->
	<update id="memberUpdate" parameterType="com.example.memboard.dto.MemberDTO">
		update member set pw=#{pw},name=#{name},email=#{email},tel=#{tel},zipcode=#{zipcode},addr=#{addr},addr2=#{addr2}
		where id=#{id}
	</update>
	
	<!-- 탈퇴 -->
	<delete id="memberDelete" parameterType="String">
		delete from member
		where id=#{id} 
	</delete>
</mapper>

 

 

 

6. Service


MemberService.java
@Service("com.example.memboard.service") : 경로(패키지)&고유id역할

@Resource(name="") : 해당 인터페이스의 @Repository id 값을 넣는다.

 

사실 인터페이스는 new 생성자로 생성하여 return 할 수 있는 대상이 아니다.

작동은 인터페이스에 연결된 MemberMapper.xml 가 하지만 

일단 인터페이스를 return 하고 있으니 throws Exception 을 던지는 듯 하다.

package com.example.memboard.service;

import java.util.Map;
import java.util.List;

import javax.annotation.Resource;
import org.springframework.stereotype.Service;

import com.example.memboard.dto.MemberDTO;
import com.example.memboard.mapper.MemberMapper;

@Service("com.example.memboard.service.MemberService")
public class MemberService {
	
	@Resource(name="com.example.memboard.mapper.MemberMapper")
	MemberMapper memberMapper;
	
	//id 중복체크, 내 정보 수정
	public MemberDTO getMemberService(String id) throws Exception {
		return memberMapper.selectOne(id);
	}
	//회원가입
	public void insertMemberService(MemberDTO memberDTO) throws Exception {
		memberMapper.insertMember(memberDTO);
	}
	//로그인
	public MemberDTO loginProService(Map map) throws Exception {
		return memberMapper.selectLogin(map);
	}
	
	//DB에 내 정보 수정
	public void updateService(MemberDTO memberDTO) throws Exception {
		memberMapper.memberUpdate(memberDTO);
	}
	
	//탈퇴
	public void memberDelete(String id) throws Exception {
		memberMapper.memberDelete(id);
	}

}//class-end

 

 

 

7. Controller


MemberController.java
경로: com.example.memboard