ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [spring] member Business,Dataservice(xml방식)
    JAVA 2021. 8. 4. 09:59

    STS

    스프링 툴 스위트(STS, Spring Tool Suite)란 이클립스 기반 스프링 애플리케이션을 개발 하기 위한 개발 환경을 의미하며, 오픈소스이다.

     

    다운로드 : spring-tool-suite-3.9.12.RELEASE-e4.15.0-win32-x86_64.zip

    https://dist.springsource.com/release/STS/index.html

     

    해당 파일 압축을 풀기

    경로 ~\sts-bundle\sts-3.9.15.RELEASE = STS.exe (실행파일)


    1. STS 프로젝트 만들기

    sts + mybatis + mysql


    2. mysql db, table 만들기

    cmd 창

    C:\Users\ehdbs>cd c:\mysql5.5
    
    c:\MySQL5.5>cd bin
    
    c:\MySQL5.5\bin>mysql -u root -p
    Enter password: *****
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1
    Server version: 5.5.62 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> create database ch20;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use ch20;
    Database changed
    mysql> create table member(
        -> id varchar(20) not null primary key,
        -> pw varchar(15) not null,
        -> name varchar(30) not null,
        -> email varchar(30) not null,
        -> tel     varchar(14) not null,
        -> zipcode varchar(10) not null,
        -> addr varchar(50) not null,
        -> addr2 varchar(30) not null,
        -> regdate date not null
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> create table board(
        -> num int not null primary key auto_increment,
        -> writer varchar(30) not null,
        -> subject varchar(40) not null,
        -> pw varchar(15) not null,
        -> regdate datetime,
        -> readcount int default 0,
        -> ref int not null,
        -> re_step int not null,
        -> re_level int not null,
        -> content text not null,
        -> ip varchar(20) not null
        -> );
    Query OK, 0 rows affected (0.01 sec)

     


    3. pom.xml에 library 추가 [ https://mvnrepository.com/ 여기서 검색 가능 ]

    • spring-jdbc (스프링의 JDBC, Spring version과 동일)
    • mysql-connector-java
    • mybatis
    • mybatis-spring (스프링에서 Mybatis 연동을 위한 모듈)
    • spring-test

    pom.xml

    		<!-- 추가 library -->
    		<!-- MyBatis -->
          <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.2.8</version>
          </dependency>
          
          <!-- mybatis-spring -->
          <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis-spring</artifactId>
             <version>1.2.2</version>
          </dependency>
    
          <!-- Mysql -->
          <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.31</version>
          </dependency>
    
          <!--spring-jdbc -->
          <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-jdbc</artifactId>
             <version>3.2.3.RELEASE</version>
          </dependency>
          <!-- //추가 library -->

    4. web.xml 에 한글 인코딩필터 설정

    web.xml

       <!-- 한글처리 -->
       <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>
    
       <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
       </init-param>
        </filter>
    
       <filter-mapping>
          <filter-name>characterEncodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
       </filter-mapping>

    5. mybatis-config.xml 설정 파일 생성 [위치 : Java Resources/src/main/resources/]

     

    1) MemberDTO 를 사용하며 Mapper 로 사용하는 xml 들을 설정한다.

    2) root_context.xml 에서 SqlSessionFactoryBean 클래스를 통해 MyBatis 방식으로 비즈니스 업무하도록 설정한다.

     

    mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd" >
    
    <configuration>
    	<typeAliases>
    	  <typeAlias alias="member77" type="co.kr.Hello.dto.MemberDTO"/>
    	</typeAliases>
    
    	<mappers>
    		<mapper resource="/mybatis/member.xml"/>
    	</mappers>
    </configuration>

    6. root-context.xml

    Config(클래스-어노테이션) 방식에서 MyBatisConfig 와 같은 역할이다!(@Configuration)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
    	
    	<!-- Root Context: defines shared resources visible to all other web components -->
    	
    	<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
    	    <property name="driver" value="com.mysql.jdbc.Driver"/>
    	    <property name="url" value="jdbc:mysql://localhost:3306/ch20?useUnicode=true&amp;characterEncoding=UTF-8"/>
    	    <property name="username" value="root"/>
    	    <property name="password" value="12345"/>
    	</bean>
    	
    	<bean id="transactionManager"
    	    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	    <property name="dataSource" ref="dataSource"></property>
    	</bean >
    	
    	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	    <property name="dataSource" ref="dataSource"></property>
    	    <property name="configLocation"
    	        value= "classpath:/mybatis/mybatis-config.xml">
    	    </property>
    	</bean>
    	
    	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    	    <constructor-arg ref="sqlSessionFactory"></constructor-arg>
    	</bean>
    </beans>

     

    Config(클래스-어노테이션) 방식과 비교해보기

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
    	
    	<!-- Root Context: defines shared resources visible to all other web components -->
    	
    	<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
    	    <property name="driver" value="com.mysql.jdbc.Driver"/>
    	    <property name="url" value="jdbc:mysql://localhost:3306/ch20?characterEncoding=UTF-8"/>
    	    <property name="username" value="root"/>
    	    <property name="password" value="12345"/>
    	</bean>
    	
    	<bean id="transactionManager"
    	    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	    <property name="dataSource" ref="dataSource"></property>
    	</bean >
    	
    	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	    <property name="dataSource" ref="dataSource"></property>
    	    <property name="configLocation"
    	        value= "classpath:/mybatis/mybatis-config.xml">
    	    </property>
    	</bean>
    	
    	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    	    <constructor-arg ref="sqlSessionFactory"></constructor-arg>
    	</bean>
    </beans>

    7. memberDTO

    package co.kr.Hello.dto;
    import java.util.Date;
    
    //모델빈
    public class MemberDTO {
    	//전역변수=필드=프로퍼티=property
    	
    	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 생략
    	
    }

    8. member.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">
    
    <mapper namespace="member">
    	<!-- id중복체크, 내 정보 수정 -->
    	<!-- public memberDTO selectOne(String id){db로~~} 와 같은 상황!! -->
    	<!-- member77 로 별칭. 또는  co.kr.Hello.dto.MemberDTO 로 풀네임도 가능(해당 설정은 mybatis-config.xml 을 만들어 설정해줬다.)-->
    	<select id="selectOne" parameterType="String" resultType="member77">
    		select * from member 
    		where id=#{id}
    	</select>
    
    	<!-- 회원가입 -->
    	<insert id="insertMember" parameterType="co.kr.Hello.dto.MemberDTO">
    		insert into member(id,pw,name,email,tel,zipcode,addr,addr2,regdate) 
    		values(#{id},#{pw},#{name},#{email},#{tel},#{zipcode},#{addr},#{addr2},NOW())
    	</insert>
    	
    	<!-- 로그인,map사용 -->
    	<select id="selectLogin" parameterType="map" resultType="member77">
    		select * from member 
    		where id=#{id} and pw=#{pw}
    	</select>
    	
    	<!-- 내 정보 수정 -->
    	<update id="memberUpdate" parameterType="member77">
    		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>

    9. MemberController

    package co.kr.Hello;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.apache.ibatis.session.SqlSession;//Mybatis �� ����
    import java.util.*;//HashMap
    import co.kr.Hello.dto.MemberDTO;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    import javax.naming.NamingException;
    
    import org.springframework.ui.Model;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.bind.annotation.ModelAttribute;
    
    @Controller
    public class MemberController {
    	@Autowired private SqlSession sqlSession;// sqlSessionFactory(mapper 설정) 를 저장한 sqlSession
    	
    	@RequestMapping("main.do")
    	public String mm() {
    		return "main";// views/main.jsp
    	}
    	
    	//회원가입 폼
    	@RequestMapping("insertForm.do")
    	public String insertForm() {
    		return "/member/insertForm";//views/member/insertForm.jsp
    	}
    	
    	//id중복체크(map사용)
    	@RequestMapping(value="confirmID.do",method=RequestMethod.POST)
    	public String idCheck(String id,Model model) {
    		int check = -1;
    		MemberDTO memberDTO = sqlSession.selectOne("member.selectOne",id);//'member.xml의 namespace'.'select태그의 id', 매개값
    		if(memberDTO==null) {
    			check=1;//사용가능한 id
    		}else {
    			check=-1;//사용 불가능한 id
    		}
    		
    		model.addAttribute("check",check);
    		return "/member/confirmID";//views/member/confirmID.jsp
    	}
    	
    	//회원가입 db 저장
    	@RequestMapping(value="insertPro.do",method=RequestMethod.POST)
    	public String insertPro(@ModelAttribute("memberDTO") MemberDTO memberDTO,
    			HttpServletRequest request)throws IOException,NamingException {
    		
    		String email1 = request.getParameter("email1");
    		String email2 = request.getParameter("email2");
    		String email = email1+email2;
    		memberDTO.setEmail(email);
    
    		String tel1 = request.getParameter("tel1");
    		String tel2 = request.getParameter("tel2");
    		String tel3 = request.getParameter("tel3");
    		String tel = tel1+tel2+tel3;
    		memberDTO.setTel(tel);
    		
    		sqlSession.insert("member.insertMember",memberDTO);//namespace.insert.insert태그의 id, 매개값
    		return "main";
    	}
    	
    	//로그인 폼
    	@RequestMapping("loginForm.do")
    	public String loginForm() {
    		return "/member/loginForm";//views/member/loginForm.jsp
    	}
    	
    	//로그인 db 업무
    	@RequestMapping(value="loginPro.do",method=RequestMethod.POST)
    	public String loginPro(String id, String pw,Model model) {
    		//Map, HashMap
    		HashMap<String, String> map = new HashMap<String, String>();
    		map.put("id", id);
    		map.put("pw", pw);
    		
    		MemberDTO mdto = sqlSession.selectOne("member.selectLogin",map);
    	
    		if(mdto==null) {//일치하는 회원이 없다.
    			model.addAttribute("msg","아이디 또는 비밀번호가 일치하지 않습니다.");
    			return "/member/loginForm";
    		}
    		
    		//일치하는 회원이 있다.
    		model.addAttribute("mdto",mdto);
    		return "/member/loginSuccess";
    	}
    	
    	//로그아웃
    	@RequestMapping("logOut.do")
    	public String logOut() {
    		return "/member/logOut";//;logOut.jsp
    	}
    	
    	//회원정보수정 폼
    	@RequestMapping(value="memUpdateForm.do",method=RequestMethod.POST)
    	public String updateForm(String id, Model model) {
    		
    		MemberDTO mdto = sqlSession.selectOne("member.selectOne",id);
    		
    		//example@daum.net
    		String email = mdto.getEmail();
    		int idx=email.indexOf("@");
    		String email1 = email.substring(0,idx);//example
    		String email2 = email.substring(idx);//daum.net
    		model.addAttribute("email1",email1);
    		model.addAttribute("email2",email2);
    		
    		//01023456789
    		String tel = mdto.getTel();
    		String tel1 = tel.substring(0,3);//010
    		String tel2 = tel.substring(3,7);//2345
    		String tel3 = tel.substring(7);//6789
    		
    		model.addAttribute("tel1",tel1);
    		model.addAttribute("tel2",tel2);
    		model.addAttribute("tel3",tel3);
    		
    		model.addAttribute("mdto",mdto);
    		
    		return "/member/updateForm";//updateForm.jsp
    	}
    	
    	//회원정보수정 db 처리
    	@RequestMapping(value="memIpdatePro.do",method=RequestMethod.POST)
    	public String memIpdatePro(@ModelAttribute("memberDTO")MemberDTO memberDTO,
    			HttpServletRequest request) throws IOException,NamingException{
    		
    		String email1 = request.getParameter("email1");
    		String email2 = request.getParameter("email2");
    		String email = email1+email2;
    		memberDTO.setEmail(email);
    		
    		String tel1 = request.getParameter("tel1");
    		String tel2 = request.getParameter("tel2");
    		String tel3 = request.getParameter("tel3");
    		String tel = tel1+tel2+tel3;
    		memberDTO.setTel(tel);
    		
    		sqlSession.update("member.memberUpdate",memberDTO);
    		
    		return "main";
    	}
    	
    	//회원탈퇴 db 처리
    	@RequestMapping("deleteMember.do")
    	public String deleteMember(String id) {
    		
    		sqlSession.delete("member.memberDelete",id);
    		return "main";
    	}
    }//class-end

    댓글

Designed by Tistory.