2022. 10. 9. 13:06ㆍDev.Program/Java & Spring
< MyBatis >
>
MemDAOImpl 에 SQL 구문이 다 들어있다! 그래서 이걸 바꾸면 자바파일 계속 바꿔야함
그래서 SQL 구문을 xml 에 만들어서 xml 만 호출할 수 있도록 만들 거!
→ 자바 파일을 전혀 손 안대도 된다.
- 우리는 지금 spring 이 3버전!
- 그래서 context.xml 에 뭐가 많이 적혀있다!
- 4버전으로 하면 이제 이런거 다 지워지고 DB 연동, MyBatis 연동만 남음
- 새 프로젝트 만들기
- Next
- Finish
< MyBatis 이용하여 DB연동하기 위한 사전 작업 >
- MVC 프로젝트 만들기
- JDK 버전 설정 1.8
- 지금은 1.6
- 프로젝트에서 오른쪽 버튼 누르고 Properties
< 자바 버전 맞추기 >> 첫번째 설정
- 1.8 버전으로 바꾸기
> 두번째 설정
- 1.8 버전으로 바꾸기
- 1.8로 변경되어있다!
- 스프링 버전
< 스프링 버전 맞추기 >< pom.xml >
- 저장 누르면 자동으로 4버전으로 바뀜
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.36</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency> |
- 커넥터랑 spring-jdbc 설치하기
- 코드만 붙여넣고 저장하면 됨!
< web.xml >
<filter> <filter-name>encoding</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>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
- 한글설정
- 코드만 붙여넣고 저장하기!
http://localhost:8080/myweb/member/insert
- WAS 에서 처리 request, response 생성 요청정보 저장
- 서블릿, 한글설정 web.xml 무조건 참조하게 되어있음!
- servlet-context.xml , root-context.xml 참조함
- web.xml 보면 참조하는 거 볼 수 있다!
- servlet-context.xml : 자동으로 스캔하게끔 폴더 목록을 넣어줌
> src/main/java 폴더 내부에
======== com.itwillbs.controller 패키지 만들기
======== com.itwillbs.service 패키지 만들기
======== com.itwillbs.dao 패키지 만들기
======== com.itwillbs.domain 은 앞에 꺼 복사해오기
< servlet-context.xml >
<context:component-scan base-package="com.itwillbs.myweb2" /> <context:component-scan base-package="com.itwillbs.controller" /> <context:component-scan base-package="com.itwillbs.service" /> <context:component-scan base-package="com.itwillbs.dao" /> |
- 추가해주기
- root-context.xml : DB 연동
< root-context.xml >
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/jspdb1"/> <property name="username" value="jspid"/> <property name="password" value="jsppass"/> </bean> |
- 디비 연동하는 설정 넣어주기
- 기본적인 세팅은 완료되었고, 이제 찾아들어갈 것!
com.itwillbs.controller MemberController 클래스 @Controller (어노테이션)
com.itwillbs.service MemberService 인터페이스 / MemberServiceImpl 클래스
com.itwillbs.dao MembeDAO 인터페이스 / MemberDAOImpl 클래스
======== MemberController.java 만들기
package com.itwillbs.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class MemberController { @RequestMapping(value = "/member/insert", method = RequestMethod.GET) public String insert() { return null; } } |
- 어노테이션 필수
======== views 안에 member 폴더 만들기! 폴더!
- 1에서 했던 jsp 들 다 들고오기! 총 7개
< MemberController.java >
@Controller public class MemberController { @RequestMapping(value = "/member/insert", method = RequestMethod.GET) public String insert() { // views/member/insertForm.jsp 이동 return "/member/insertForm"; } } |
- 추가
- 실행화면(주소창 잘 보기!)
< insertForm.jsp >
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>insertForm</h1> <form action="./member/insert" method="post"> 아이디 : <input type="text" name="id"><br> 비밀번호 : <input type="password" name="pass"><br> 이름 : <input type="text" name="name"><br> <input type="submit" value="회원가입"> </form> </body> </html> |
- 이렇게 하면
- 회원가입 눌렀을 때 주소창에 member/ 가 중복됨 ( . 으로 주소를 찾아가면 현재페이지 기준으로 가기 때문)
- 이걸 taglib 로 주소를 찾아가게 만들 거!
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>insertForm</h1> <form action="<c:url value='/member/insert'/>" method="post"> 아이디 : <input type="text" name="id"><br> 비밀번호 : <input type="password" name="pass"><br> 이름 : <input type="text" name="name"><br> <input type="submit" value="회원가입"> </form> </body> </html> |
- 태그라이브러리를 이용해서 주소값 찾아감(맨 앞 슬래시 꼭 붙여주기!)
- 회원 가입 누르면 주소창 잘 찾아감! (오류는 일단 보류)
< MemberController.java >
@RequestMapping(value = "/member/insert", method = RequestMethod.POST) public String insertPost(MemberBean mb) { // 작업 : MemberServiceImpl(처리작업) -> MemberDAOImpl(DB작업) System.out.println(mb.getId()); return "redirect:/member/login"; } |
- 아이디 입력하고 회원가입해보기
- 주소창 확인
- 콘솔창에 뜸! (값이 잘 넘어온다)
======== MemberService.java(인터페이스로 만들기)
======== MemberServiceImpl.java(인터페이스 상속 받기)
< MemberServiceImpl.java >
package com.itwillbs.service; import org.springframework.stereotype.Service; @Service public class MemberServiceImpl implements MemberService { } |
- @Service 어노테이션 필수
< MemberService.java >
package com.itwillbs.service; import com.itwillbs.domain.MemberBean; public interface MemberService { // 추상메서드 public void insertMember(MemberBean mb); } |
- 추상메서드 하나 만들기
< MemberServiceImpl.java >
@Service public class MemberServiceImpl implements MemberService { @Override public void insertMember(MemberBean mb) { } } |
- 추상메서드 구현하기(@Override 어노테이션 필수)
======== MemberDAO.java(인터페이스로 만들기)
======== MemberDAOImpl.java(인터페이스 상속 받기)
< MemberDAOImpl.java >
package com.itwillbs.dao; import org.springframework.stereotype.Repository; @Repository public class MemberDAOImpl implements MemberDAO { } |
- 어노테이션 필수!
< MemberDAO.java >
package com.itwillbs.dao; import com.itwillbs.domain.MemberBean; public interface MemberDAO { // 추상메서드 public void insertMember(MemberBean mb); } |
- 추상메서드 만들기
< MemberDAOImpl.java >
package com.itwillbs.dao; import org.springframework.stereotype.Repository; import com.itwillbs.domain.MemberBean; @Repository public class MemberDAOImpl implements MemberDAO { @Override public void insertMember(MemberBean mb) { System.out.println("MemberDAOImpl - insertMember()"); } } |
< MemberController. java >
package com.itwillbs.controller; import javax.inject.Inject; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.itwillbs.domain.MemberBean; import com.itwillbs.service.MemberService; @Controller public class MemberController { // 기존 자바 객체생성 // MemberService memberService = new MemberServiceImpl(); // 자동객체생성 : xml에서 MemberServiceImpl객체생성 set메서드 호출해서 값주입 @Inject private MemberService memberService; //가상주소 http://localhost:8080/myweb2/member/insert @RequestMapping(value = "/member/insert", method = RequestMethod.GET) public String insert() { // views/member/insertForm.jsp 이동 return "/member/insertForm"; } @RequestMapping(value = "/member/insert", method = RequestMethod.POST) public String insertPost(MemberBean mb) { System.out.println(mb.getId()); // 작업 : MemberServiceImpl(처리작업) -> MemberDAOImpl(DB작업) 객체생성 메서드호출 memberService.insertMember(mb); return "redirect:/member/login"; } } |
- @Inject ← 자동 주입
- 여기서 memberService 라는 변수명은 변경하면 안됨! 하나의 약속!
< MemberServiceImpl.java >
@Service public class MemberServiceImpl implements MemberService { @Inject private MemberDAO memberDAO; @Override public void insertMember(MemberBean mb) { System.out.println("MemberServiceImpl - insertMember()"); memberDAO.insertMember(mb); } } |
- Service 에서도 MemberDAO 자동으로 객체 생성하는 거 만들어줌
- 여기서 memberDAO 라는 변수이름은 변경하면 안됨! 약속된 거
- 콘솔창 보면 찾아들어가는 것을 알 수 있다!
< MyBatis 연동 >
- 두 개 설치
< pom.xml >
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> |
- pom.xml 에 붙여넣고 저장하기(자동설치)
- Maven 보면 설치되어있다
< root-context.xml >
- SqlSessionFactoryBean 자동완성!
- 우린 미리 설치해놨기 때문에 자동완성이 됨
- 참조변수 가져옴
- 설정파일들(xml), sql 파일들(xml)
> 마이바티스 사이트(한글설명) https://mybatis.org/mybatis-3/ko/index.html
- 이런 값들 복사해서 가져오기! (직접 적으면 에러날 수 있기 때문에~~)
< MyBatis 설정 >
- 환경설정 파일들은 resources 에 만듦!
- mybatis-config.xml 이름으로 새 xml 파일 만들기
> 1) 설정파일
======== src/main/resources 파일 안에 mybatis-config.xml
< mybatis-config.xml >
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> |
- 추가해주기
- 환경설정들 모아두는 파일!
> 2) Sql구문 파일
======== src/main/resources 파일 안에 mappers 폴더 만들기
======== mappers 폴더 안에 memberMapper.xml 만들기
< memberMapper.xml >
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
- 추가해주기
- Sql 구문들 모아두는 파일!
< root-context.xml >
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:/mybatis-config.xml"/> <property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"/> </bean> |
- value 값 넣어주기
- 우리는 memberMapper.xml 파일만 만들었는데, 나중에 이 보라색 부분은 파일들이 점점 추가될 거! 그래서 * 로 적어줘야함
- 파란색 부분은 안에 폴더가 들어갈 수도 있다는 의미의 ** 추가! (없을 수도 있고 있을 수도 있고 전체 경우의 수 추가)
-------- 여기까지가 설정 완료!
> 이제 이걸 쓰겠다고 선언해줘야함
- SqlSessionTemplate
- 깨끗하게 캐시를 비우겠다는 의미
- property 는 set 메서드를 호출해서 값을 넣는것!
> property set 메서드 사용하는 거 말고, 생성자를 호출할 수도 있음
- 생성자를 통해 값을 넣을 건데, 생성자가 초기화가 안되어있어서 빨갛게 오류나는 것!
- 생성자 호출 <constructor-arg name=”초기값이름” ref=”참조값”></constructor-arg>
- 참조!
< root-context.xml >
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg> </bean> |
- 최종 추가 코드
> DB 설정은 끝남! 이제 이걸 MemberDAOImpl 에서 가져다쓸 거!
< MemberDAOImpl.java >
@Inject private SqlSession sqlSession; |
- 추가해주기
- 객체 생성! @Inject 필수
- 이런식으로 넣어줌
- 파일이름은 실제 파일이름이 아니라 xml 내부에서 붙여준 이름
< memberMapper,xml >
- 우리가 정하는 파일이름 namespace
- mapper 한 묶음의 이름을 이렇게 지정한다
- Sql구문 이름은 보통 함수이름을 그대로 사용한다(헷갈리지 않기 위해서)
<?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.itwillbs.mapper.MemberMapper"> <insert id="insertMember"> INSERT INTO member(id, pass, name, reg_date) values(#{id},#{pass},#{name},#{reg_date}) </insert> </mapper> |
- ? 물음표 대신에 #{변수이름} ⇐ 꼭 똑같이 적어줘야함! 똑같이 적어야 값을 찾아간다
- 세미콜론은 붙이면 안됨!
< MemberDAOImpl.java >
- 아무나 수정못하게 private
- 객체생성 하지 않고 어디서나 호출 가능하도록 static 붙여줌
- 계속 호출되니까 파일이름은 이렇게 멤버변수로 만들어둔다
- . 필수! +로 합쳐준다.
- mb 를 넣으면 이름에 맞는 거 자동으로 골라옴
package com.itwillbs.dao; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Repository; import com.itwillbs.domain.MemberBean; @Repository public class MemberDAOImpl implements MemberDAO { @Inject private SqlSession sqlSession; private static String namespace="com.itwillbs.mapper.MemberMapper"; @Override public void insertMember(MemberBean mb) { System.out.println("MemberDAOImpl - insertMember()"); sqlSession.insert(namespace+".insertMember", mb); } } |
- 코드
< 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> </configuration> |
- 설정값이 없으면 공백으로 놔두면 됨!
- <configuration> </configuration> 가 기본적으로 세팅이 되어있어야 함
- 실행해보기
- 디비에 Insert 됨!
> 로그인 직접 해보기
< MemberController.java >
@RequestMapping(value = "/member/login", method = RequestMethod.GET) public String login() { return "/member/loginForm"; } @RequestMapping(value = "/member/login", method = RequestMethod.POST) public String loginPost(MemberBean mb, HttpSession session) { System.out.println(mb.getId()); System.out.println(mb.getPass()); System.out.println("로그인처리"); // 리턴값 MemberBean mb2 = userCheck(mb); MemberBean mb2 = memberService.userCheck(mb); // 아이디 비밀번호 일치하면 mb2 회원정보 모두 가져오기 if(mb2!=null) { // 일치 // 세션값 생성 "id", id session.setAttribute("id", mb.getId()); } else { // 일치하지 않음 메세지 뿌리기 } return "redirect:/member/main"; } @RequestMapping(value = "/member/main", method = RequestMethod.GET) public String main() { return "/member/main"; } |
- 메서드 만들기
- 메인 주소가 들어왔을 때(GET방식) 주소이동시키는 메서드도 만들기
< MemberService.java >
public MemberBean userCheck(MemberBean mb); |
< MemberServiceImpl.java >
@Override public MemberBean userCheck(MemberBean mb) { System.out.println("MemberServiceImpl - userCheck()"); return memberDAO.userCheck(mb); } |
- 추가
- memberDAO 에 userCheck() 메서드 자동완성하기
< MemberDAO.java >
public MemberBean userCheck(MemberBean mb); |
< MemberDAOImpl.java >
@Override public MemberBean userCheck(MemberBean mb) { System.out.println("MemberDAOImpl - userCheck()"); return sqlSession.selectOne(namespace+".userCheck", mb); } |
- 추가
- 하나만 리턴하기 때문에 selectOne() 함수 사용
< memberMapper.xml >
<mapper namespace="com.itwillbs.mapper.MemberMapper"> <insert id="insertMember"> INSERT INTO member(id, pass, name, reg_date) values(#{id},#{pass},#{name},#{reg_date}) </insert> <select id="userCheck" resultType="com.itwillbs.domain.MemberBean"> SELECT * FROM member WHERE id=#{id} AND pass=#{pass} </select> </mapper> |
- MemberBean 에 담기 때문에 MemberBean 의 경로값을 적어줌
> 실행해보기 http://localhost:8080/myweb2/member/login
- 콘솔창
- 실행결과
- 로그인 처리 잘 됨!
> 이제 로그인할 때 아이디/비밀번호 틀렸을 때를 제어해보자
< MemberController.java >
@RequestMapping(value = "/member/login", method = RequestMethod.POST) public String loginPost(MemberBean mb, HttpSession session, Model model) { System.out.println(mb.getId()); System.out.println(mb.getPass()); System.out.println("로그인처리"); // 리턴값 MemberBean mb2 = userCheck(mb); MemberBean mb2 = memberService.userCheck(mb); // 아이디 비밀번호 일치하면 mb2 회원정보 모두 가져오기 if(mb2!=null) { // 일치 // 세션값 생성 "id", id session.setAttribute("id", mb.getId()); } else { // 아이디 없음, 비밀번호 틀림 model.addAttribute("msg", "입력하신 정보가 일치하지 않습니다"); // views/member/msg.jsp 이동 return "/member/msg"; } return "redirect:/member/main"; } |
- else 부분 추가해주기! 메세지를 담아서 jsp 단으로 감
======== member 폴더 안에 msg.jsp 만들기
< msg.jsp >
<h1>/WEB-INF/views/member/msg.jsp</h1> <script type="text/javascript"> alert("${msg}"); history.back(); </script> |
- body 부분에 추가해주기
- 일치하지 않을 경우 이렇게 alert 창 뜸
> 로그아웃 해보기
< MemberController.java >
// 로그아웃 @RequestMapping(value = "/member/logout", method = RequestMethod.GET) public String logout(HttpSession session) { // 세션 초기화 session.invalidate(); return "redirect:/member/main"; } |
- 추가
⇒ 클릭 시
< main.jsp >
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>/WEB-INF/views/main.jsp</h1> <c:if test="${empty sessionScope.id}"> <c:redirect url="/member/login"/> </c:if> ${sessionScope.id }님 로그인 하셨습니다. <input type="button" value="로그아웃" onclick='location.href="<c:url value='/member/logout'/>"'><br> <a href="<c:url value='/member/info'/>">회원정보조회</a><br> <a href="<c:url value='/member/update'/>">회원정보수정</a><br> <a href="<c:url value='/member/delete'/>">회원정보삭제</a><br> <c:if test="${!(empty sessionScope.id) }"> <c:if test="${sessionScope.id eq 'admin'}"> <a href="<c:url value='/member/list'/>">회원목록</a><br> </c:if> </c:if> </body> </html> |
- 경로 다 바꾸기
'Dev.Program > Java & Spring' 카테고리의 다른 글
[Spring] - (6) ajax, AOP (0) | 2022.10.10 |
---|---|
[Spring] - (5) (0) | 2022.10.10 |
[Spring] - (3)데이터베이스 연동 (0) | 2022.10.09 |
[Spring] - (2) (0) | 2022.10.09 |
[Spring] - (1)설치 및 설정하기 (0) | 2022.10.09 |