interceptor 를 이용하여 자동 로그인 구현

로그인 창에 자동 로그인 체크박스 생성

 

체크박스 클릭 후 로그인 시 : on, 체크박스 클릭하지 않고 로그인 시 : null ( required = false 처리를 해줘야 함 ) 처리 후 체크된 상태로 로그인 성공 시 cookie 값을 발급하고 유저의 id 정보를 쿠키 값으로 저장시킨다

 

alter table membership add 
   session_id varchar2(100) default 'nan' not null;

테이블 추가

( 값이 존재하지 않는다면 nan 으로 저장된다 )

테이블 추가 완료

 

DB 에 추가된 컬럼을 관리할 sessionId 변수와 getter / setter 를 DTO 에 추가 >> 이후 Mapper.xml 에도 session_id 컬럼과 sessionId 변수를 mapping 시켜준다

 

사용자의 쿠키 값과 DB 에 저장된 값이 일치해야 자동 로그인을 처리할 것임

 

Service 인터페이스에 메소드 추가 >> ServiceImpl 에서는 id 값과 autoLogin 값을 HashMap 에 키와 값으로 저장하여 mapper 에 전달

 

Mapper 인터페이스에 메소드 추상화, Mapper.xml 에 해당 메소드에 매핑될 sql 문 작성

 

자동 로그인 체크 후 로그인 성공 시 DB 에 저장되는 것 확인

 

AutoLogin Interceptor 에서 loginCookie 값이 있는지 확인 후 해당 값이 있으면 DB 안에 설정되어 있는 session_id 의 값이 "on" 인지 체크한 뒤 session 의 LOGIN 키의 값을 id 로 생성해준다 >> servlet-context.xml 에 index 경로로 들어오기 전 실행될 AutoLogin 클래스 Interceptor 선언

 

servlet-context.xml 파일에서 모든 경로에서 autoLogin 으로 설정한 Interceptor 가 작동하게 설정

 

Controller 에서 logout 경로로 들어올 시 cookie 값을 만료시키고 DB 안에 on 으로 저장되어 있던 session_id 컬럼의 값을 nan 으로 변경시킨뒤 세션을 모두 삭제하고 login 페이지로 돌려보낸다

728x90

 

 

 

 

 

Interceptor

Interceptor

 

Interceptor : 컨트롤러로 가기 전에 무언가 처리할 내용 ( preHandle ) 이나, 컨트롤러 까지 로직 작동 후 클라이언트에게 도착하기 전에 처리할 내용 ( postHandle ) 을 담당 ( 불필요한 리소스를 차단 )

 

Interceptor 패키지, 클래스 파일 생성

 

메소드 오버라이딩

 

servlet-context.xml 파일에 MemberInterceptor 클래스를 /index 경로가 실행될때 사용할 Interceptor 로 설정 ( /index 경로로 접속할때 컨트롤러로 전달되기 전 오버라이딩 한 메소드인 preHandle 이 실행, 컨트롤러로 전달된 후 오버라이딩 한 메소드인 postHandle 이 실행된다 )

 

MemberInfo 를 로그인한 사용자만 확인할 수 있게 Interceptor 를 사용해서 설정할 것임 >> Controller 에서도 세션을 기준으로 redirect 로 처리할 수 있음 그러나 로직을 세션을 비교하는 부분마다 다 작성해줘야 하기 때문에 비효율적....

 

servlet-context.xml 에 Interceptor 로 미리 로직을 분류할 경로를 추가 >> session 값을 미리 Controller 에 도착하기 전에 Interceptor 에서 확인하여 Controller 로 이동시킬지 Controller 로 이동시키지 않고 redirect 로 login 페이지로 이동시킨다

 

스크립트를 사용해서 alert 창도 띄워주게끔 설정

 

코드 실행

 

위와 같이 하위 경로를 모두 표현하여 사용할 수도 있다

 

728x90

 

 

 

 

 

비밀번호 암호화

 

Spring security web ( 암호화 )

 

BcryptPasswordEncoder 클래스의 encode() 메소드를 사용해서  암호화 처리

 

암호화된 부분을 맞는지 확인 ( BcryptPasswordEncoder 클래스의 matches 메소드를 사용하여 평문인 pwd 와, 암호화 되어 저장된 dto.getPwd 를 비교 )

 

 

 

 

 

 

 

 

 

 

다음 주소 API 사용

 

api 코드 긁어서 jsp 에 적용하기

 

버튼을 누르면 daum 주소 찾기 api 함수가 작동되게끔 설정 >> api 검색 시 반환되는 데이터인 data 를 콘솔로 확인

 

data 내의 userSelectedType 값이 R 이면 도로명 주소로 주소를 선택, J 이면 지번 주소로 주소를 선택 한 것이다. ( R : 도로명, J : 지번 )

 

if 문을 사용해서 지번, 도로명 중 선택한 주소를 addr 변수로 저장 >> data 의 값 중 우편번호를 저장하고 있는 zonecode 도 활용하여 우편번호까지 저장

 

script 파일로 분리

 

api 사용 영상
728x90

 

 

 

 

 

싱글톤 패턴 ( Singleton Pattern )

사용 이유 : 싱글톤 패턴은 전체 애플리케이션에서 단 하나의 인스턴스만을 생성하여 사용하고자 할 때 사용한다

이는 공유 리소스 관리나 크로스-커팅 서비스( 애플리케이션의 여러 부분에 걸쳐 공통적으로 적용되는 기능을 말한다 ) 제공에 유용하다

 

스프링에서는 기본적으로 모든 빈객체를 싱글톤으로 생성하여 관리한다

 

싱글톤 사용의 장점

1. 메모리 낭비 방지

2. 전역 인스턴스로 애플리케이션 어디서나 접근이 가능

3. 데이터 공유의 용이성

 

싱글톤 사용의 단점

1. 싱글톤 인스턴스가 너무 많은 역할을 담당하게 되면 변경과 테스트가 어려워진다

2. 멀티스레드 환경에서 동기화 처리가 필요하다 ( 생성된 빈 객체를 동시에 사용할 수 없기 때문 )

 

 

 

 

 

 

 

 

 

 

팩토리 메소드 패턴 ( Factory Method Pattern )

사용 이유 : 객체 생성 처리를 서브 클래스로 분리하여 객체 생성 로직의 변경이나 확장이 필요할 때 유연하게 대처하기 위해 사용

 

스프링에서 인스턴스 생성을 추상화하고, 이를 상속받는 서브 클래스에서 해당 인스턴스의 구체적인 타입을 결정하게 하게 한다

public interface PaymentProcessor {
    void processPayment();
}

public class CreditCardProcessor implements PaymentProcessor {
    @Override
    public void processPayment() {
        // 신용카드 결제 로직 처리
    }
}

public class PayPalProcessor implements PaymentProcessor {
    @Override
    public void processPayment() {
        // PayPal 결제 로직 처리
    }
}

@Component
public class PaymentProcessorFactoryImpl implements PaymentProcessorFactory {
    @Override
    public PaymentProcessor createPaymentProcessor() {
        // 설정 등에 따라 생성할 프로세서 결정 로직
        return new CreditCardProcessor();
    }
}

코드 예시로서 결제에 관련된 인터페이스를 생성한 뒤 해당 인터페이스를 상속받아 기능에 따라 다양하게 구현

 

팩토리 메소드 패턴 사용의 장점

1. 유연성 : 팩토리 메소드 패턴은 프로그램 실행 중에 어떤 객체를 생성할지 결정할 수 있게 해준다, 이는 프로그램이 더 유연하게 동작하도록 돕는다

2. 낮은 결합도 : 클라이언트 코드가 구체적인 클래스를 몰라도 되기 때문에 서로 간의 의존성이 낮아진다

3. 유지보수의 용이성 : 팩토리 메소드 패턴을 사용하면 새로운 객체 타입을 추가하거나 변경해도 기존 코드를 수정할 필요가 없어 유지보수가 쉬워진다

 

팩토리 메소드 패턴 사용의 단점

1. 복잡성 증가 : 팩토리 메소드 패턴을 사용하면 각 객체마다 팩토리 클래스가 필요하기 때문에 코드가 복잡해질 수 있다

2. 서브 클래스 증가 : 새로운 객체 타입을 추가할때마다 새로운 서브 클래스를 만들어야 하기 때문에 클래스의 갯수가 증가하며 프로젝트의 크기와 복잡성을 증가시킬 수 있다 ( 서브 클래스의 증가는 관리해야 할 코드의 양의 증가와 테스트와 디버깅을 더 복잡하게 만들 수 있다 )

 

 

 

 

 

 

 

 

 

 

프록시 패턴 ( Proxy Pattern )

사용 이유 : 원본 객체에 대한 접근을 제어하거나, 원본 객체의 생명주기를 관리하거나, 원본 객체의 작업을 가상화하기 위해 사용

 

// 파일 인터페이스
public interface File {
    byte[] load();
}

// 실제 파일을 로드하는 클래스
public class RealFile implements File {
    private String path;

    public RealFile(String path) {
        this.path = path;
        loadFromDisk(path);
    }

    private void loadFromDisk(String path) {
        System.out.println("디스크에서 파일 로드: " + path);
    }

    @Override
    public byte[] load() {
        System.out.println("파일 내용을 반환합니다.");
        return new byte[0]; // 실제 파일 내용을 반환
    }
}

// RealFile 객체의 생성을 지연시키는 프록시 클래스
public class ProxyFile implements File {
    private RealFile realFile;
    private String path;

    public ProxyFile(String path) {
        this.path = path;
    }

    @Override
    public byte[] load() {
        if (realFile == null) {
            realFile = new RealFile(path);
        }
        return realFile.load();
    }
}

// 클라이언트 코드
public class ProxyExample {
    public static void main(String[] args) {
        File file = new ProxyFile("test_file.txt");
        // 파일이 실제로 필요할 때만 로드됩니다.
        file.load();
    }
}

예시 코드 ( ProxyFile 클래스에서는 요청한 파일의 객체가 이미 생성된 상태라면 다시 파일을 불러와서 객체를 생성하는 과정을 거치지 않고 이미 생성되어 있는 객체를 재사용한다 )

 

프록시 패턴 사용의 장점

1. 원본 객체를 보호하며 접근을 제어할 수 있음

2. 원본 객체의 로딩 시간 최적화

3. 원본 객체와 클라이언트 사이의 결합도 감소

 

프록시 패턴 사용의 단점

1. 응답 시간이 느려질 수 있다

2. 구현이 복잡해질 수 있다

728x90

 

 

 

 

 

단위 Test, 통합 Test

 

Mock = Controller 를 전달 받아 대체

@Transactional = insert, delete 와 같은 쿼리문을 테스트한 뒤 다시 롤백하여 처음 상태로 돌려주는 어노테이션

memberMapper.xml 에 select 문 작성 ( 현재 가져올 컬럼 중 primary key 가 없기 때문에 모두 result 태그를 사용, 만약 가져오는 컬럼 중 primary 키가 있는 컬럼은 result 가 아닌 id 태그로 매핑해줘야 한다 )

result : primary key 가 아닌 컬럼 mapping

id : primary key 인 컬럼 mapping

 

DAO 에 select 문을 실행시킬 list 메소드 작성

 

TestMember.java 에서 단위 테스트 진행 ( DAO 만 실행 테스트 ) >> null 이 아니면 초록색 바

 

MemberService 인터페이스 작성 ( jsp 쪽으로 데이터 전달해 줄 것이므로 model 객체를 전송 ) >> MemberServiceImpl 에서는 해당 model 객체를 받아서 model 객체 안에 list 라는 이름으로 DAO 의 list 메소드가 반환한 값을 addAttribute 로 추가해준다

 

Controller 에서 Service 의 list 메소드 호출할때 model 객체 넘기는 코드 작성

 

통합 테스트 진행 >> 성공

 

index.jsp 작성 후 테스트 >> list 객체 잘 들어오며 사이즈와 데이터 값도 잘 출력되는 것 확인

 

기존 insert 경로는 데이터 추가 후 바로 jsp 파일을 출력해서 list 가 존재하지 않아 출력되지 않았는데 이를 출력해주기 위해 redirect 를 사용해서 클라이언트가 다시 요청해서 데이터를 받게끔 설정 >> 이렇게 리다이렉트를 설정해주면 통합 테스트에서 리다이렉트가 정상적으로 진행되는지를 따로 설정해주지 않으면 오류가 발생되므로 코드를 변경해준다

 

 

 

 

 


 

 

 

 

 

실습 예제

문제

( 비밀번호는 댓글 )

2_회원가입(JDBC_QUIZ).pdf
0.32MB

 

 

풀이

7_회원가입(JDBC_QUIZ)_3.pdf
0.94MB

 

 

예제 풀이 ( 프로젝트 기본 세팅 )

테이블 생성 및 데이터 삽입

 

Spring Legacy Project 생성

 

pom.xml 버전 설정 후 저장

 

메이븐 프로젝트 업데이트 ( 단축키 Alt + F5 ) >> JRE System Library 에 JavaSE 버전이 1.8 로 변경된 것 확인

※ 꼭 업데이트는 pom.xml 변경 후 저장한뒤 할 것 ※

 

HikariCP 라이브러리 추가

 

Spring JDBC 아무 버전이나 라이브러리 추가 >> 상단에 내가 사용중인 스프링 버전의 변수를 복사 >> 내 스프링 버전으로 변경

 

Oracle DB 버전 확인 후 라이브러리 추가 ( Oracle DB 버전이 11 버전 : ojdbc6 설치, Oracle DB 버전이 19 버전 이상 : ojdbc8 에 맞는 버전으로 설치 ) >> 나는 Oracle DB 버전이 19.3.0.0 버전이므로 ojdbc8 의 19.3.0.0 버전 라이브러리를 추가

 

MyBatis 버전 3.4.6 라이브러리 추가

 

MyBatis 와 Spring 을 연동시켜주는 MyBatis Spring 을 버전 1.3.2 로 설치

 

web.xml 파일에 한글 인코딩 에러 해결 코드 작성

 

Spring 인코딩 UTF-8 로 설정하는 코드

 

[Spring] 인코딩 설정, 포트 에러, Context 에러(경로 충돌 에러), 경로 설정, Controller

인코딩 설정, 포트 에러, Context 에러, 경로 설정, Controller ▼ 인코딩 해결 코드 ▼ 위 파일 내용 복사 후 진행 포트 충돌 에러가 발생하는 경우 경로 충돌 에러가 발생하는 경우 @Controller 어노테이

youngho3358.tistory.com

 

 

 

 

 

예제 풀이 ( 프로젝트 파일 세팅, Mapper 설정, 사용할 라이브러리들을 빈으로 등록 )

MemberMapper.xml 파일은 일반 xml 파일

 

jsp 파일 세팅

 

Mapper.xml 설정 코드

 

mybatis – 마이바티스 3 | 시작하기

 

mybatis.org

매핑된 SQL 구문 살펴보기 바로 하단에 있는 코드를 긁어와서 붙여넣으면 된다

 

위 링크에서 Mapper.xml 설정 코드 긁어와서 MemberMapper.xml 에 내용 작성 >>  필요없는 부분 삭제 및 namespace 를 현재 프로젝트의 MemberMapper 로 변경

 

root-context.xml 설정 ( Maven Dependencies 에 추가된 jar 파일 내에 있는 클래스들 중 사용할 것들을 빈 객체로 등록, 히카리 커넥션 풀을 빈으로 등록할때 DB 를 내 DB 의 정보로 변경한 뒤 올려준다 )

 

 

 

 

 

예제 풀이 ( 실제 구현 )

Controller 와 Service 에 어노테이션 추가 및 인터페이스 상속

 

DTO 에 컬럼 값과 동일한 변수 선언, getter / setter 설정

 

MemberMapper.xml 파일에서 DTO 의 변수와 OracleDB 의 컬럼을 resultMap 태그로 매핑해준다

 

기본 Controller 에 get 방식으로 index url 로 접속 시 index.jsp 출력하는 코드 작성

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<style type="text/css">
		ul li{ display:inline; padding:0 10px; }
	</style>
</head>
<body>
	<div align="center" >
		<h1 style="color:burlywood; font-size:60px; font-family:Gabriola;">
			CARE &nbsp; LAB
		</h1>
	</div>
	<div align="right">
		<hr>
		<ul>
			<li><a href="/root/index">HOME</a></li>
			<li><a href="/root/member/login">로그인</a></li>
		</ul>
		<hr>
	</div>
</body>
</html>

header.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>
	<div align="center" style="padding-top:100px;">
		<hr>
		<i style="color:pink; font-size:30px; font-family:Gabriola;">
			Copyright ⓒ CARE Lab. All rights reserved.
		</i>
	</div>
</body>
</html>

footer.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>
	<div align="center">
		<table>
			<tr>
				<td align="center">
					<h3>내 사전에 불가능은 없다.<br>
						불가능은 소극적인 자의 환영이며<br>
						비겁한 자의 도피처 이다.<br>
					</h3>
				</td>
			</tr>
			<tr>
				<td align="right">
					<h3>- 나폴레옹</h3>
				</td>
			</tr>
		</table>
	</div>
</body>
</html>

main.jsp

 

index.jsp 작성 ( header, main, footer 불러와서 사용 - jstl 사용 )

 

서버 작동 후 /root 경로 충돌로 인해 에러 발생

 

Servers - Tomcat v9.0 Server at localhost-config - server.xml 에서 동일 경로 주석처리 >> 웹 구동 확인

 

로그인 경로를 Controller 에 선언

 

Controller 에 선언 >> login.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>
	<c:import url="../default/header.jsp"/>
	<div align="center">
		<h1>로그인 페이지 입니다</h1>
	</div>
	<div align="right">
		<form action = " /root/member/user_check" method="post">
			<table>
				<tr>
					<td>
						<input type="text" name="id" placeholder="아이디">
					</td>
					<td rowspan="2">
						<input type="submit" value="로그인"style="width:60px;height:55px;">
					</td>
				</tr>
				<tr>
					<td>
						<input type="text" name="pw" placeholder="비밀번호">
					</td>
				</tr>
				<tr>
					<td colspan="2" align="left">회원가입</td>
				</tr>
			</table>
		</form>
	</div>
	<c:import url="../default/footer.jsp"/>
</body>
</html>

login.jsp

 

Controller 에 사용자가 아이디, 비밀번호 입력 시 이동될 user_check url 작성

 

MemberService 인터페이스에 user_check 메소드 선언 >> MemberServiceImpl 에서는 MemberMapper 를 통해 id 값에 해당하는 DB 저장 값을 가져와 DTO 에 저장하고 해당 값으로 입력된 비밀번호와 일치하면 0을 리턴, 아니면 1을 리턴한다

 

MemberMapper 인터페이스에 user_check 메소드를 추상화 >> MemberMapper.xml 에서 select 문을 작성 ( id : 메소드명, resultMap : 결과를 위에서 선언한 MemberDTO 형태로 매핑하여 가져오겠다는 뜻 )

 

session 의 값들을 처리할 인터페이스 생성 >> Controller 에서는 session 을 처리할 인터페이스인 MemberSessionName 을 상속받은 뒤 사용 >> successLogin.jsp 에서는 세션 값인 loginUser 를 출력 >> 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

 

 

 

 

 

 

JPA 를 학습하느라 IntelliJ 를 설치 후 java22 버전을 설치했는데 원래 설치되어 있던 java 11 버전과 충돌이 발생함

 

이 경우 sts 설치 폴더 > STS.ini 파일에 사용할 java 의 버전을 명시해주면 된다

 

기존 sts.ini 파일 >> 변경 sts.ini 파일

 

위와 같이 설정하면 STS 를 실행하면 Virtual Machine 을 java jdk 11 버전으로 실행하게 된다

 

 

▼ 참고 ▼

 

eclipse, intellij jdk버전 설정

intellij를 사용하기 위해, 17버전의 자바를 설치해야한다근데 eclipse와 intellij를 둘다 사용하기 위해서는 eclipse(legacy spring)는 11버전을 요구하고, intellij는 17버전을 요구하기 때문에 각각 다르게 버

xodud5080.tistory.com

 

728x90

 

 

 

 

 

DB 연동

 

파일 세팅

!!! MemberDAO 파일 Interface 파일로 만들어야 함 주의 !!!

pom.xml 버전 세팅

 

프로젝트 우측 클릭 > maven > update project 클릭

 

web.xml 인코딩 추가

 

파일 세팅 완료

 

일반 xml 파일 세팅

 

일반 class 파일 세팅

 

Spring Bean Configuration File 생성 ( xml 파일 )

 

 

 

 

 

스프링에서는 JUnit 을 사용하여 테스트를 진행

 

JUnit 기능

 

 

 

 

 

JUnit 패키지 다운로드 및 적용

메이븐 레파지토리 검색하여 페이지 접속 후 spring-test 검색 >> 아무 버전이나 클릭 ( 버전은 아래서 바꿔줄 것이기 때문 ) >> 코드 복사

 

pom.xml 에 dependencies 태그 안에 붙여넣기 >> pom.xml 상단의 버전 copy >> 붙여넣은 코드에 version 복사한 것으로 바꾸기

 

프로젝트 우클릭 >> properties >> Java Build Path >> Libraries >> Add Library >> JUnit 선택 >> Next >> JUnit 4 선택 >> Finish >> Apply and Close

 

설치 완료


 

 

 

 

 

JUnit 을 사용하여 Test

 

컨트롤러 빈에 등록 ( 테스트 해볼 것임 ) >> testMember.xml 파일에 com.care.root 부터 모든 빈 객체를 테스트할때 사용하겠다라고 설정

 

- testMember.xml 파일에 설정하는 부분 -

웹 구동 파일이 많아 서버를 재시작하며 테스트 하기에 시간이 오래걸리는 경우 서버는 켜둔 상태로 빈 객체만 가져와서 객체가 정상적으로 작동하는지 테스트하기 위해 해당 xml 파일에 사용할 빈 객체의 범위를 설정하여 사용한다

 

TestMember.java 에 테스트 코드 작성 후 메소드에 마우스 올려둔 뒤 Ctrl + F11 눌러 JUnit 선택 후 확인 >> 빈 객체가 정상적으로 생성된 것 확인

 

MemberServiceImpl.java 에 MemberService 를 상속받은 뒤 @Service 어노테이션을 사용하여 빈 객체로 등록 >> Test 코드를 작성하여 assertNotNull 를 사용해서 해당 빈 객체가 null 값이 아니라 정상적으로 생성 되었는지 확인 ( 메소드에 커서 놓고 Ctrl + F11 ) >> 빈 객체가 null 이 아니라 정상주입 되었다면 결과가 초록색 바로 출력된다

 

create table test_mybatis(
    id number(4),
    name varchar2(20)
);

Oracle DB 에 테이블 추가

 

테이블 추가 완료

 

1. 마이바티스 프레임워크를 사용할 것임

2. 히카리 cp 를 사용해서 connection pool 기능을 사용할 것임

connection pool - 미리 DB 에 연결해 놓은 객체를 생성한뒤 연결 객체를 호출되는 곳에 빌려준다.

 

라이브러리 추가

HikariCP 라이브러리 검색 ( 3.3.1 버전 사용할 것임 ) >> 코드 복사 >> pom.xml 에 추가

 

Spring JDBC 검색 >> 아무 버전이나 가져온 뒤 pom.xml 에 붙여넣기 >> 버전 교체

 

MyBatis 라이브러리 설치 ( 버전 확인 후 설치 )

 

Spring 용 마이 MyBatis 도 라이브러리 설치 ( 버전 확인 후 설치 )

 

내 피씨의 오라클DB 버전 확인

 

오라클 DB 버전 11 버전 : ojdbc6

오라클 DB 버전 19 버전 이상 : ojdbc8

 

내 오라클 DB 버전과 동일한 버전의 라이브러리 선택 후 설치

 

pom.xml 저장하면 Maven Dependencies 에 추가한 내용들이 저장된 것 확인할 수 있음

 

라이브러리 설치 끝

 


 

 

 

 

 

DB 연결 설정

 

HikariCP 설정

HikariConfig.class 열기 >> 패키지이름과 class 이름 복사

 

root-context.xml 에 아까 복사한 [패키지이름].[클래스명] 을 class 에 입력 후 property 추가하여 해당 클래스의 변수인 username, password, jdbcUrl, driverClassName 의 값을 자신의 오라클 DB 설정 값으로 넣어준다

 

위에서 설정한 hikariConfig 빈을 매개변수로 생성자에 넣어서 HikariDataSource 클래스 빈을 ds 라는 이름으로 생성

 

 

 

 

 

마이바티스 설정

SqlSessionFactoryBean.class 열어서 패키지이름, 클래스 이름 저장

 

root-context.xml 에 마이바티스 관련된 빈 객체 저장 ( property 를 사용하여 dataSourse 변수에 위에서 설정한 ds 빈을 넣고 mapperLocations 변수에 src/main/resources/mapper/ 폴더 하위의 모든 폴더 내에 있는 Mapper.xml 로 끝나는 파일들을 설정해준다

 

memberMapper.xml 파일에 생성한 MemberDAO 인터페이스 파일을 등록

 

root-context.xml 작성

 

 

 

세팅 완료....


 

 

 

 

DB 연결 테스트

 

DAO 빈 객체가 정상적으로 연결되는지 확인 ( 메소드에 커서 후 Ctrl + F11 ) >> 정상 연결

 

DTO, DAO 작성

 

memberMapper.xml 에 insert 작성

 

DAO 테스트 코드 작성 >> 메소드에 커서 두고 Ctrl + F11 >> 초록색 바 ( 성공 )

 

추가한 내용 잘 적용되는지 sql developer 에서도 확인

 

위에서는 DAO 만 실행해서 코드를 진행시켰는데 이번엔 Service 에서 DTO 객체를 DAO 로 넘겨서 실행시킬때도 문제가 없는지 확인해볼 것임

 

Service 에 dao 에 dto 객체 전달하는 코드 작성

 

테스트 코드 실행 >> 성공 >> sql developer 에서도 확인

 

데이터 삭제하는 코드 테스트 할 것임 >> DAO 작성 >> memberMapper.xml 에 deleteUser 메소드에 대한 쿼리문 작성

 

테스트 메소드에 커서 둔 뒤 Ctrl + F11 하여 테스트 >> 성공 >> result 로 1 반환 ( 성공 )

 

 

 

 

 

Controller 로 요청을 받아 실행이 되는지 테스트

Controller ( Mock ) > Service > DAO 순으로 전체적인 테스트를 진행

Controller 작성 >> TestMock 클래스 파일 생성하여 Controller 의 접속 경로와 데이터 까지 받아서 테스트 진행 ( MockMvc 는 수동으로 import 해줘야 하므로 아래의 코드 넣어줘야 함 ) >> 메소드 클릭 후 실행

 

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;

Mock import 코드

 

코드 실행 시 200 으로 나오면 성공적으로 연결되었다는 의미, 초록색 바 ( 성공 ) >> sql developer 에서도 확인

 

테스트 코드이기 때문에 코드 실행 후 롤백 시키는 기능 추가 >> 테스트 코드를 아무리 실행시켜도 이젠 데이터가 저장되지 않음 ( 저장 이후 롤백되게 때문, 즉 실행이 정상적으로 되는지 확인만 하고 실제 데이터는 저장되지 않음 )

 

 

 

 

 

위에서 테스트가 정상적으로 실행되는 것이 확인되었기 때문에 실제로 구현

실제 웹 작성하여 구동

 

정상 구동 확인

 

728x90

 

 

 

 

 

정적 파일 관리

 

정적 파일을 관리하는 resources 폴더

javascript, css 등을 관리

 

정적 파일을 관리할 폴더 생성

 

css 파일 생성 후 작성

 

javascript 파일 생성 후 작성, img 폴더에 이미지도 추가

 

servlet-context.xml 에 있는 resources 관리 부분 ( location 이 리소스의 위치 지정 부분 )

 

jsp 파일에서 jstl 문법을 사용하여 url 을 path 변수로 설정하고 확인해본다

 

link 태그를 사용하여 css 도 적용

 

css, js 파일 경로 설정 및 별칭

/resources/css/ 경로의 파일을 /css/** 로 사용하겠다,  /resources/js/ 경로의 파일을 /js/** 로 사용하겠다

 

css 파일 생성 및 별칭 jsp 파일에 적용 ( 절대경로로 표현해봄 )

 

js 파일을 jsp 파일에서 불러와 js 파일 내에 선언해 놓은 test() 함수를 호출하여 버튼 클릭 시 사용 ( alert 함수 선언해 놓았음 )

 

js 파일 적용 영상
728x90

+ Recent posts