ABOUT ME

-

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

    댓글

Designed by Tistory.