모도리는 공부중

21.03.03. SPRING - 본문

K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12/JAVA

21.03.03. SPRING -

공부하는 모도리 2021. 3. 3. 12:56
728x90
반응형

jstl 라이브러리를 사용하려면 jstl api를 다운받아 라이브러리에 넣고

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

을 상단에 작성하여 세팅을 마친다.

 

MemberVO에 num이라는 int값을 추가하고 getter와 setter를 생성, km.smhrd.model폴더에 MemberDAO라는 인터페이스(Interface)를 생성한다.

package kr.smhrd.model;

import java.util.List;

public interface MemberDAO {
	// CRUD
	public int memberInsert(MemberVO vo);
	public List<MemberVO> memberList(); // list니까 vo타입으로 받아줘야겠죠?
	public int memeberUpdate(MemberVO vo); // 0이면 실패, 1이면 성공. true false를 받기 위한 변수
	public int memberDelete(int num); // 키값은 num에 해당하는 db값을 삭제해주면 되겠죠?
	public MemberVO memberContent(int num); // 선택한(특정 키값(고유값)) 회원 상세보기
	// 위의 다섯가지 로직은 ERP시스템에서 거의 공통으로 사용된다.
}

위의 코드를 작성한 후 model에 MemberDAOImpl이라는 클래스(Class)를 생성한다.

Add Unimplemented methods를 눌러주면

package kr.smhrd.model;

import java.util.List;

public class MemberDAOImpl implements MemberDAO {

	@Override
	public int memberInsert(MemberVO vo) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public List<MemberVO> memberList() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int memeberUpdate(MemberVO vo) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int memberDelete(int num) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public MemberVO memberContent(int num) {
		// TODO Auto-generated method stub
		return null;
	}

}

다음과 같이 자동으로 오버라이드된다.

 

이제부턴 JDBC가 아닌 myBatis Framework를 사용할 것인데 자바 소스코드에서 SQL코드를 별도의 파일로 꺼내서 만들어줄 것이다. xml이라는 확장자의 파일로 만들어 밖으로 빼주고 sql이 빠진 자리는 밖으로 빠진 xml을 연결하는 api를 사용하는데 이 api가 바로 myBatis Framework이다. 정리하면 myBatis framework api는 한마디로 SQL Mapping Framework라고 할 수 있다.(중요!!)

 

blog.mybatis.org/

 

The MyBatis Blog

A blog about the the MyBatis data mapper framework.

blog.mybatis.org

위 링크를 눌러 접속하면 myBatis에 대한 사이트인데 거기에서 products를 눌러 들어간다.

download 클릭

3.4.2를 찾아 zip파일을 다운받고 압축을 풀어준다.

그리고 web-inf - lib폴더에 해당 파일을 드래그해서 복사.

 

이 jaf파일에 대한 사용설명서는 압축에 같이 있는 pdf파일을 참고해도 되고 아니면 하단 사이트를 참고해도 좋다.

 

mybatis.org/mybatis-3/getting-started.html

 

mybatis – MyBatis 3 | Getting started

It's very important to understand the various scopes and lifecycles classes we've discussed so far. Using them incorrectly can cause severe concurrency problems. Dependency Injection frameworks can create thread safe, transactional SqlSessions and mappers

mybatis.org

데이터베이스 sql 쿼리문을 얼마나 잘 사용하느냐에 따라 코드를 다룰 일이 많이 줄어든다. 그만큼 DB는 상당히 중요하다. 현업에서도 마찬가지이다. 오히려 자바코드보다 데이터베이스 쿼리를 더 잘 만지게 될 수도 있다...

 

kr.smhrd.db폴더에 SQL file을 생성한다.

 

C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib

Oracle을 선택 후 next - Drivers 옆에 있는 별모양을 누른다.

Oracle Thin Driver 11을 선택 - JAR List - 기존에 있는 파일 clear 후 add jars 선택.

 

C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 경로를 찾아가서 아까 라이브러리에 추가해주었던 ojdbc6을 선택한다.

mySQL은 db계정을 만들어서 그 안에서 딱 하나만 만드는데 오라클은 그렇지 않다. 실제로 자바에서도 jdbc를 할 때 이 드라이버가 필요하다. 이클립스도 마찬가지.

다음은 별표 옆에 있는 edit driver definition을 눌러서 수정해준다.

기존에는 localhost로 했던 부분을 127.0.0.1로 해서 설마 개개인의 컴퓨터마다 각각 다른 ip를 집어넣어야하나 하고 당황했다. 하지만 아니다. localhost = 127.0.0.1이라고 한다. 컴퓨터 내부 아이피를 127.0.0.1로 하며 또 다른 말로는 localhost로 사용하는 것이니 당황하지 않고 사용하면 된다.

type은 Oracle_11, Name은 New Oracle, Database는 xe를 선택해준다.

 

SQL문 작성.

create table memtbl(
	num number not null,
	id varchar2(20) not null primary key,
	pass varchar2(20) not null,
	name varchar2(20) not null,
	age number not null,
	phone varchar2(20) not null,
	email varchar2(20) not null
);

create sequence memtbl_num_seq;

-- 관리자
insert into MEMTBL values(memtbl_num_seq.nextval, 'admin', 'bit', '관리자', 32, '010-1111-1111', 'admin@smhrd.com');

select * from MEMTBL;

 

기존 컴퓨터에 member라는 테이블이 있는 관계로 memtbl이라는 회원테이블을 생성하였다. 테이블을 생성할 때 주의할 점은 MemberVO에 변수를 선언한 순서대로 만들어주면 좋다는 것이다. 이유는 규칙성 때문.

화면이 다크테마이다보니 sql문은 잘 보이지 않는다는 단점이 있다.

지금까지 만든 DO를 보자. (아까 interface를 만들어준 것들?)

그럼 이것들을 컨트롤할 컨트롤러는 몇개가 있어야할까? 한 개? 다섯 개? 컨트롤러가 많으면 컨트롤러라고 하기 어렵지 않을까..

특정 요청만 받는 것이 아닌 모든 요청을 받아야한다. 모든 요청을 받아주는 것은 아스타리카(*)가 대신 한다.

MemberFrontController라는 서블릿(servlet)을 만든다. 만들 때 url 매핑값을 손대줘야 하는데,

위와 같이 매핑값을 바꿔주면 된다. 만들 때 /를 떼는 것을 잊지 말자.

package kr.smhrd.frontcontroller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("*.do")
public class MemberFrontController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 클라이언트의 요청정보를 확인하기
		String reqUrl = request.getRequestURI(); // 클라이언트가 요청한 url정보를 얻어와서 reqUrl변수에 담아준다. 
		System.out.println(reqUrl);
	}

}

127.0.0.1:8081/mvc/memberList.do를 url입력창에 직접 입력해보면 다음과 같이 콘솔창에 값이 넘어간 것을 확인할 수 있다.

우리는 이 주소중에서 memberList.do만 필요하다. 이를 위해 mvc를 잘라주어야겠는데 방법이 무엇일까? 일단 mvc는 ContextPath이다. 이걸 알았다면 잘라낼 방법이 떠올라야 한다. 바로 request.getContextPath();이다. 이것을 이용해 ctx라는 변수에 담아주고 잘라내보자.

String command = ?; // /memberList.do만 잘라오려면 어떻게 해야할까?

reqUrl에서 ctx를 잘라내면 되지 않을까? 생각해서 String command = reqUrl - ctx;를 했다면 바로 빨간줄을 만나봤을 것이다. 왜냐면 이것은 숫자가 아닌 문자열이기 때문. 문자열을 슬라이싱하는 방법은 우리가 이전에 배웠던 substring을 이용하면 된다.

package kr.smhrd.frontcontroller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("*.do")
public class MemberFrontController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1. 클라이언트의 요청정보를 확인하기
		String reqUrl = request.getRequestURI(); // 클라이언트가 요청한 url정보를 얻어와서 reqUrl변수에 담아준다. 
//		System.out.println(reqUrl);
		
		// Context Path = ?
		String ctx = request.getContextPath();
//		System.out.println(ctx); // Context Path인 /mvc만 잘라내기
		
		String command = reqUrl.substring(ctx.length()); // /memberList.do만 잘라오려면 어떻게 해야할까?
		System.out.println(command);
		
		// 2. 해당 요청에 따른 분기 작업(HandlerMapping) : if ~ else ~
		if (command.equals("/memberList.do")) {
			
		} else if (command.equals("/memberInsert.do")) {
			
		}
	}

}

서블릿은 FrontController, 자바는 POJO라고 부른다.

Plan Old Java Object = POJO. 컨트롤러에 요청 들어온 값을 컨트롤러에서 전부 처리해주는 것이 아닌, 그 안에서 처리할 일들을 각각의 클래스로 빼서 처리한다.

이렇게 각각의 pojo를 생성한다.

모든 pojo는 method이름을 통일시켜주는 것이 사용할 때 편하다. (일반적으로 통일해서 사용한다.)

pojo들이 가지고 있어야할 interface를 생성한다. Controller라는 이름으로 만들어준다.

package kr.smhrd.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Controller {
	// void -> String
	public void requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException;
	
}

그리고 MemberList와 MemberInsert Controller에 implement해준다.

package kr.smhrd.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 유연성이 떨어진다?
public class MemberListController implements Controller {

	@Override
	public void requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
	}

}
package kr.smhrd.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MemberInsertController implements Controller{

	@Override
	public void requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		
	}

}

이제 sql처리를 해줄 kr.smhrd.myBatis package를 src에 생성한다.

※myBatis 폴더에 저장해야 할 목록※
1.properties(속성)
2.configure(환경설정)(중요!!)
3.Mapper(SQL)

방금 만들어준 패키지폴더에 file을 검색하여 db.properties를 생성한다.

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:XE
username=hr
password=hr

xml을 검색해서 xml File을 생성한다. 파일명은 config.xml.

next next finish.

생성하면 다음 코드 한 줄만 적힌 파일이 열린다.

<?xml version="1.0" encoding="UTF-8"?>

아까 링크 받았던 사용설명서를 열어서 다음 그림에 있는 노란색 부분을 복사해서 가져와준다.

왼쪽은 영어버전, 오른쪽은 한글버전 설명서.

그리고 config.xml에서 configuration 바로 아랫줄에 properties라는 태그 한 줄을 추가한다. 이 코드는 jdbc를 연결하는 properties파일을 연결하는 역할을 해줄 것이다.

<properties resource="kr/smhrd/mybatis/db.properties"/>

이번엔 MemberMapper라는 명의 xml파일을 생성한다. 그 후 다시 사용설명서로 돌아가서 해당 부분의 mapper코드를 전체 가져오는데 이 중에서 select구문은 지워준다.

namespace에는 우리가 아까 만들어둔 MemberMapper 경로를 작성한다.

<?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="kr.smhrd.mybatis.MemberMapper"> <!-- namespace로 mapper가 중복되지 않도록 구분 -->

</mapper>

 

이후 config.xml에서 mapper resource값을 변경해준다. 전부 처리해주고 나면 다음과 같은 코드가 완성된다.

<?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>
  <properties resource="kr/smhrd/mybatis/db.properties"/>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="kr/smhrd/mybatis/MemberMapper.xml"/>
  </mappers>
</configuration>

어... 졸았다..

728x90
반응형
Comments