1) 프로젝트 만들기
File - New - Other - spring - spring Legacy project - Next - Project Name - springProject2 - Templates Spring MVC Project 선택 - Next - Yes -package : com.itwillbs.myweb2 - Finish
2) 자바 버전 변경
프로젝트 오른쪽 버튼 - Properties - Java Compiler - JDK Compliance - Alt + u - 11으로 변경 - Project Facets - Dynamic Web Module - 3.1 - Java - 11 - Apply and Close
3) p33 스프링 버전 변경 => 4.3.8 버전으로 변경
pom.xml
<java-version>11</java-version>
<org.springframework-version>4.3.8.RELEASE</org.springframework-version>
4) 프로그램 설치 (JDBC, spring JDBC)
pom.xml
https://mvnrepository.com 검색해서 설치할 파일의 코드를
pom.xml 코드 넣으면 자동으로 프로그램 다운되면서 설치됨
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
5) 가상주소 시작 => web.xml (서블릿 지정, 한글설정)
<!-- post전송 request 한글처리 "utf-8" 설정 -->
<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>
6) /WEB-INF/spring/appServlet/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="http://com.itwillbs.dao" />
주소매핑 => 자동으로 메서드 호출
@Controller MemberController
@RequestMapping(value = "/member/insert", method = RequestMethod.GET)
객체생성
@Inject => @Service
private MemberService memberService;
@Inject => @Repository
private MemberDAO memberDAO;
7) /WEB-INF/spring/root-context.xml 연결
DB 연결
<?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 -->
<!-- 데이터베이스 연결 객체 생성
프로그램 설치
→ 자동으로 프로그램 설치 Maven 의존
→ Maven 서버에 프로그램이 저장되어 있고 다운받고자 하는 프로그램 이름을 적으면 다운받아서 사용
→ 프로그램 맨 아래 pom.xml(다운받고 싶은 프로그램 목록을 적음)
→ 웹 maven repository 검색
→ https://mvnrepository.com/에서 mysql 검색
→ 중간에 Maven 코드 복사
→ pom.xml에 코드 붙여넣기
→ https://mvnrepository.com/에서 Spring JDBC 검색
→ 버전 수정 <version>${org.springframework-version}</version> -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/jspdb?serverTimezone=Asia/Seoul"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>
</beans>
프로그램 설치(MyBatis, MyBatisSpring)
마이바티스를 이용해서 프로그램을 사용
-> pom.xml에서 mybatis, MyBatisSpring 프로그램 설치
-> root-context.xml에 mybatics 객체 생성
mvnrepository.com에서 mybatis, mybatisspring 코드 복사해서 web.xml에 붙여넣기
pom.xml 코드 넣으면 자동으로 프로그램 다운되면서 설치됨
<!-- Mybatis -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- Mybatis Spring -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
※ MyBatis는 자바 퍼시스턴스 프레임워크의 하나로 XML이나 애노테이션을 사용해 저장 프로시저나 SQL문으로 객체들을 연결시킴. 즉, 자바 DB연동하는 프레임 워크라고 할 수 있음. MyBatis를 사용하므로서 자바에 SQL구문을 없앨 수 있음
src/main/resource에 mybatis-config.xml 생성
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
src/main/resource 폴더 mappers 생성 후 memberMapper.xml 생성
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itwillbs.mappers.memberMappers">
</mapper>
https://mybatis.org/mybatis-3/index.html 참조해서 사용
root-context.xml
<?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 -->
<!-- 데이터베이스 연결 객체 생성
프로그램 설치
→ 자동으로 프로그램 설치 Maven 의존
→ Maven 서버에 프로그램이 저장되어 있고 다운받고자 하는 프로그램 이름을 적으면 다운받아서 사용
→ 프로그램 맨 아래 pom.xml(다운받고 싶은 프로그램 목록을 적음)
→ 웹 maven repository 검색
→ https://mvnrepository.com/에서 mysql 검색
→ 중간에 Maven 코드 복사
→ pom.xml에 코드 붙여넣기
→ https://mvnrepository.com/에서 Spring JDBC 검색
→ 버전 수정 <version>${org.springframework-version}</version> -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/jspdb?serverTimezone=Asia/Seoul" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
<!-- pom.xml에서 mybatis 프로그램 설치
→ root-context.xml에 mybatis 설정, 객체 생성
→ https://blog.mybatis.org/
→ https://mybatis.org/mybatis-3/
→ https://mybatis.org/mybatis-3/getting-started.html
→ src/main/resources 폴더에 XML파일 생성 mybatis-config.xml 파일 만들기
→ src/main/resources 폴더 - mappers 폴더(SQL 폴더) 만들기
→ memberMapper.xml 파일 만들기-->
<!-- 객체 생성 <bean> -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- property : 속성값(멤버변수를 속성이라고함) ref="참조변수명" -->
<property name="dataSource" ref="dataSource" />
<!-- value=경로/환경설정파일의 위치 -->
<property name="configLocation"
value="classpath:/mybatis-config.xml" />
<!-- value=경로/sqlmapper 파일 위치 -->
<property name="mapperLocations"
value="classpath:mappers/**/*Mapper.xml" />
</bean>
<!-- => mybatis 사용(연결정보) 객체 생성
=> destroy-method="clearCache" 기억장소 삭제
=> MemberDAO에서 자동 객체 생성
@Inject
private SqlSession sqlSession;
-->
<bean id="sqlSession"
class="org.mybatis.spring.SqlSessionTemplate"
destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory"
ref="sqlSessionFactory" />
</bean>
</beans>
※Bean의 주요 속성
- class : 정규화 된 자바 클래스 이름
- id : bean의 고유 식별자
- property : 생성 시 bean setter에 전달할 인수
- constructor-arg : 생성 시 생성자에 전달할 인수
- scope : 객체의 범위
MemberDAO
package com.itwillbs.dao;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.itwillbs.domain.MemberDTO;
@Repository
public class MemberDAO {
//마이바티스 멤버 변수 정의 => 객체 생성 자동으로 전달(주입) 받음
@Inject
private SqlSession sqlSession;
public void insertMember(MemberDTO memberDTO) {
System.out.println("MemberDAO insertMember()");
// sql구문(전체파일이름.sql 구문 이름), 값
sqlSession.insert("com.itwillbs.mappers.memberMapper.insertMember", memberDTO);
}
}
memberMapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace="com.itwillbs.mappers.memberMappers"
=> memberMapper.xml 파일 => xml 파일이름 -->
<mapper namespace="com.itwillbs.mappers.memberMappers">
<!-- sql구문 이름 = 메소드명과 같이하는게 편함
id="insertMember" sql 구문의 이름
? 대신에 memberDTO 멤버변수 이름 적어줌 #{변수명}-->
<insert id="insertMember">
insert into member(id,pw,name,date)
<!-- DB열 이름 -->
value(#{id},#{pw},#{name},#{date})
<!-- #{} memberDTO의 멤버변수를 뜻함. 문법으로 약속되어 있음 -->
</insert>
</mapper>
memberService
package com.itwillbs.service;
import java.sql.Timestamp;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.itwillbs.dao.MemberDAO;
import com.itwillbs.domain.MemberDTO;
@Service
public class MemberService {
//MemberDAO 객체생성 → 멤버변수
//@Inject → MemberDAO 클래스 찾기 → @Repsitory 애노테이션 자동으로 찾기 → 자동으로 객체 생성
//찾으면 객체 생성
//servlet-context에 component-scan 추가
@Inject
private MemberDAO memberDAO;
public void insertMember(MemberDTO memberDTO) {
System.out.println("MemberService insertMember()");
//가입날짜 설정
memberDTO.setDate(new Timestamp(System.currentTimeMillis()));
//insertMember() 메소드 호출
memberDAO.insertMember(memberDTO);
}
}
안될 경우 위의 파일과 비교해서 해보기
MemberDAO 변수명이 길어서 줄이기
package com.itwillbs.dao;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.itwillbs.domain.MemberDTO;
@Repository
public class MemberDAO {
//마이바티스 멤버 변수 정의 => 객체 생성 자동으로 전달(주입) 받음
@Inject
private SqlSession sqlSession;
private static final String namespace = "com.itwillbs.mappers.memberMapper";
public void insertMember(MemberDTO memberDTO) {
System.out.println("MemberDAO insertMember()");
// sql구문(전체파일이름.sql 구문 이름), 값
sqlSession.insert(namespace+".insertMember", memberDTO);
}
}
mapper -> sql
dao -> sql 메소드 호출
MemberController
package com.itwillbs.controller;
import java.lang.ProcessBuilder.Redirect;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.itwillbs.domain.MemberDTO;
import com.itwillbs.service.MemberService;
//주소매핑
@Controller
@RequestMapping("/member/*") //member로 시작하는 모든 주소를 매핑
public class MemberController {
//MemberService 객체생성 → 멤버변수
//@Inject → MemberService 클래스 찾기 → @Service 애노테이션 자동으로 찾기 → 자동으로 객체 생성
//찾으면 객체 생성
//servlet-context에 component-scan 추가
@Inject
private MemberService memberService;
//@RequestMapping(value = "/insert", method = RequestMethod.GET)
@GetMapping("/insert")
public String insert() {
// WEB-INF/views/member/insert.jsp 이동
//주소는 /member/insert 주소변경없이 이동
return "/member/insert";
}
//@RequestMapping(value = "/insertPro", method = RequestMethod.POST)
@PostMapping("/insertPro")
public String insertPro(MemberDTO memberDTO) {
System.out.println("MemberController insertPro()");
System.out.println(memberDTO.toString());
//회원가입 처리
//패키지 com.itwillbs.service 파일 MemberService
//패키지 com.itwillbs.dao 파일 MemberDAO
//insertMember() 메소드 호출
memberService.insertMember(memberDTO);
// 로그인 가상 주소 /member/login 주소 변경 이동
return "redirect:/member/login";
}
// /member/login => member/login.jsp 이동
//@RequestMapping(value = "/login", method = RequestMethod.GET)
@GetMapping("/login")
public String login() {
return "/member/login";
}
}
로그인 처리
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace="com.itwillbs.mappers.memberMapper"
=> memberMapper.xml 파일 => xml 파일이름 -->
<mapper namespace="com.itwillbs.mappers.memberMapper">
<!-- sql구문 이름 = 메소드명과 같이하는게 편함
id="insertMember" sql 구문의 이름
? 대신에 memberDTO 멤버변수 이름 적어줌 #{변수명}-->
<insert id="insertMember">
<!-- DB열 이름 -->
insert into members(id,pw,name,date)
values(#{id},#{pw},#{name},#{date})
<!-- #{} memberDTO의 멤버변수를 뜻함. 문법으로 약속되어 있음 -->
</insert>
<!-- select 구문에서 결과값이 있고 resultType에 결과형을 지정 -->
<select id="userCheck" resultType="java.lang.Boolean">
select * from members
where id = #{id} and pw = #{pw};
</select>
</mapper>
package com.itwillbs.controller;
import java.lang.ProcessBuilder.Redirect;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.itwillbs.domain.MemberDTO;
import com.itwillbs.service.MemberService;
//주소매핑
@Controller
@RequestMapping("/member/*") //member로 시작하는 모든 주소를 매핑
public class MemberController {
//MemberService 객체생성 → 멤버변수
//@Inject → MemberService 클래스 찾기 → @Service 애노테이션 자동으로 찾기 → 자동으로 객체 생성
//찾으면 객체 생성
//servlet-context에 component-scan 추가
@Inject
private MemberService memberService;
(...생략...)
// /member/login => member/login.jsp 이동
//@RequestMapping(value = "/login", method = RequestMethod.GET)
@GetMapping("/login")
public String login() {
// WEB-INF/views/member/login.jsp 주소 변경 없이 이동
return "/member/login";
}
@PostMapping("/loginPro")
public String loginPro(MemberDTO memberDTO) {
System.out.println("MemberController loginPro()");
System.out.println(memberDTO.toString());
//로그인 처리
boolean result = memberService.userCheck(memberDTO);
System.out.println(result);
// 메인 가상 주소 /member/main 주소 이동 변경
return "redirect:/member/main";
}
// 가상주소 /member/main => member/main.jsp 이동
@GetMapping("/main")
public String main(MemberDTO memberDTO) {
System.out.println("MemberController main()");
return "/member/main";
}
}
package com.itwillbs.service;
import java.sql.Timestamp;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.itwillbs.dao.MemberDAO;
import com.itwillbs.domain.MemberDTO;
@Service
public class MemberService {
//MemberDAO 객체생성 → 멤버변수
//@Inject → MemberDAO 클래스 찾기 → @Repsitory 애노테이션 자동으로 찾기 → 자동으로 객체 생성
//찾으면 객체 생성
//servlet-context에 component-scan 추가
@Inject
private MemberDAO memberDAO;
public void insertMember(MemberDTO memberDTO) {
System.out.println("MemberService insertMember()");
//가입날짜 설정
memberDTO.setDate(new Timestamp(System.currentTimeMillis()));
//insertMember() 메소드 호출
memberDAO.insertMember(memberDTO);
}
public boolean userCheck(MemberDTO memberDTO) {
System.out.println("MemberService userCheck()");
//userCheck 메소드 호출
return memberDAO.userCheck(memberDTO);
}
}
package com.itwillbs.dao;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.itwillbs.domain.MemberDTO;
@Repository
public class MemberDAO {
//마이바티스 멤버 변수 정의 => 객체 생성 자동으로 전달(주입) 받음
@Inject
private SqlSession sqlSession;
private static final String namespace = "com.itwillbs.mappers.memberMapper";
public void insertMember(MemberDTO memberDTO) {
System.out.println("MemberDAO insertMember()");
// sql구문(전체파일이름.sql 구문 이름), 값
sqlSession.insert(namespace+".insertMember", memberDTO);
}
public boolean userCheck(MemberDTO memberDTO) {
System.out.println("MemberDAO userCheck");
// .selectOne() : 리턴 결과가 1개
// .selectList() : List형으로 리턴
// .selectMap() : Map형으로 리턴
return sqlSession.selectOne(namespace+".userCheck", memberDTO);
}
}
에러 → 리턴값이 true, false가 아니기 때문. 이를 수정
package com.itwillbs.controller;
import java.lang.ProcessBuilder.Redirect;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.itwillbs.domain.MemberDTO;
import com.itwillbs.service.MemberService;
//주소매핑
@Controller
@RequestMapping("/member/*") //member로 시작하는 모든 주소를 매핑
public class MemberController {
//MemberService 객체생성 → 멤버변수
//@Inject → MemberService 클래스 찾기 → @Service 애노테이션 자동으로 찾기 → 자동으로 객체 생성
//찾으면 객체 생성
//servlet-context에 component-scan 추가
@Inject
private MemberService memberService;
(...생략...)
// /member/login => member/login.jsp 이동
//@RequestMapping(value = "/login", method = RequestMethod.GET)
@GetMapping("/login")
public String login() {
// WEB-INF/views/member/login.jsp 주소 변경 없이 이동
return "/member/login";
}
@PostMapping("/loginPro")
public String loginPro(MemberDTO memberDTO) {
System.out.println("MemberController loginPro()");
System.out.println(memberDTO);//폼에서 입력한 id,pw
//로그인 처리
MemberDTO memberDTO2 = memberService.userCheck(memberDTO);
System.out.println(memberDTO2);
if(memberDTO2!=null) {
//아이디, 비밀번호가 일치하면 memberDTO2 주소값 리턴 => main 페이지로 이동
// 메인 가상 주소 /member/main 주소 이동 변경
return "redirect:/member/main";
} else {
//아이디, 비밀번호가 불일치하면 null값을 리턴 => login페이지로 이동
// 메인 가상 주소 /member/login 주소 이동 변경
return "redirect:/member/login";
}
}
}
package com.itwillbs.service;
import java.sql.Timestamp;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.itwillbs.dao.MemberDAO;
import com.itwillbs.domain.MemberDTO;
@Service
public class MemberService {
//MemberDAO 객체생성 → 멤버변수
//@Inject → MemberDAO 클래스 찾기 → @Repsitory 애노테이션 자동으로 찾기 → 자동으로 객체 생성
//찾으면 객체 생성
//servlet-context에 component-scan 추가
@Inject
private MemberDAO memberDAO;
public void insertMember(MemberDTO memberDTO) {
System.out.println("MemberService insertMember()");
//가입날짜 설정
memberDTO.setDate(new Timestamp(System.currentTimeMillis()));
//insertMember() 메소드 호출
memberDAO.insertMember(memberDTO);
}
public MemberDTO userCheck(MemberDTO memberDTO) {
System.out.println("MemberService userCheck()");
//userCheck 메소드 호출
return memberDAO.userCheck(memberDTO);
}
}
package com.itwillbs.dao;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.itwillbs.domain.MemberDTO;
@Repository
public class MemberDAO {
//마이바티스 멤버 변수 정의 => 객체 생성 자동으로 전달(주입) 받음
@Inject
private SqlSession sqlSession;
private static final String namespace = "com.itwillbs.mappers.memberMapper";
public void insertMember(MemberDTO memberDTO) {
System.out.println("MemberDAO insertMember()");
// sql구문(전체파일이름.sql 구문 이름), 값
sqlSession.insert(namespace+".insertMember", memberDTO);
}
public MemberDTO userCheck(MemberDTO memberDTO) {
System.out.println("MemberDAO userCheck");
// .selectOne() : 리턴 결과가 1개
// .selectList() : List형으로 리턴
// .selectMap() : Map형으로 리턴
return sqlSession.selectOne(namespace+".userCheck", memberDTO);
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace="com.itwillbs.mappers.memberMapper"
=> memberMapper.xml 파일 => xml 파일이름 -->
<mapper namespace="com.itwillbs.mappers.memberMapper">
<!-- sql구문 이름 = 메소드명과 같이하는게 편함
id="insertMember" sql 구문의 이름
? 대신에 memberDTO 멤버변수 이름 적어줌 #{변수명}-->
<insert id="insertMember">
<!-- DB열 이름 -->
insert into members(id,pw,name,date)
values(#{id},#{pw},#{name},#{date})
<!-- #{} memberDTO의 멤버변수를 뜻함. 문법으로 약속되어 있음 -->
</insert>
<!-- select 구문에서 결과값이 있고 resultType에 결과형을 지정 -->
<select id="userCheck" resultType="com.itwillbs.domain.MemberDTO">
select * from members
where id = #{id} and pw = #{pw};
</select>
</mapper>
'KDT > WEB' 카테고리의 다른 글
240201 WEB(조회, 펀웹1) (0) | 2024.02.01 |
---|---|
240130 WEB(회원수정,삭제) (0) | 2024.01.30 |
240125 WEB - Spring4(JDBC, 마이바티스) (0) | 2024.01.25 |
240123 WEB - SPRING3(가상주소매핑, 의존성주입) (0) | 2024.01.23 |
240122 WEB - SPRING2(환경설정, 가상주소매핑) (0) | 2024.01.22 |