[spring] spring-boot : MVC 어노테이션(Mapper,Repository,Service,Controller)
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