1. mybatipse plugin 의 사용 이유


스프링으로 controller service serviceImpl dao vo 파일에서 작업 시 


컨트롤러에서 서비스로 이동할때 


F2를 이용하거나 ctrl을 눌러 open declaration을 통해  컨트롤러에서 이동할 서비스 위치를 찾아가곤한다.


service에서 serviceImpl도 그렇고 DAO에서 VO도 그렇다.


그런데 serviceImpl 이나 dao에서 선택자(id)에 해당하는 mapper 쿼리를 빠르게 조회해보고 싶은 경우가 있다.


이럴 경우 mybatipse plugin (Eclipse plugin adding support for MyBatis SQL Mapper Framework.) 을 사용하면 많은 도움이 된다.



2. 설치 방법



https://github.com/mybatis/mybatipse


에 들어가면 자세한 설명이 있다.



이클립스나 STS에서 설치 시 


상단 메뉴 > help > install new software > add

name : mybatipse

url : http://dl.bintray.com/harawata/eclipse

를 통해 설치가 가능하다.



3. 사용 방법


prSmartreadOnlyDAO.selectDivisonRate(prCmpnDataSet) 


selectDivisonRate 의 ctrl을 누르면 open <select/> in XML Mapper가 뜨게된다.



1. Servlet의 이해

1.1 Servlet 이란

  • Servlet은 웹에서 JAVA 프로그래밍을 구현하기 위해 탄생 함.
  • JAVA 로 구현된 CGI(Common Gateway Interface) 라고들 흔히 말함
  • HTTP protocol 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속하여 개발하며, Servlet은 Container에 의해서 실행되고, 관리된다.
  • HTML 변경시 Servlet을 재컴파일 해야 하는 단점이 있다.

1.2 Servlet Container란

  • HTTP 요청을 받아서 Servlet을 실행시키고, 그 결과를 사용자 브라우저에게 전달해주는 기능을 제공하는 컴포넌트 이다.
  • Servlet을 실행하고 생명주기를 관리하는 역할을 한다.
  • Servlet과 웹 서버(Apache, nginx..)가 서버 통신 할 수 있는 방법을 제공한다.
  • 멀티 스레딩을 지원하여 클라이언트의 다중 요청을 알아서 처리해준다.
  • 대표적인 Conatainer에는 Tomcat, jetty, jboss 등이 있다.

1.3 Servlet 동작과정


  • ① 사용자가 URL을 클릭하면 HTTP Request를 Servlet Container에 보낸다.
  • ② Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
  • ③ 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다. (DD를 참조하여 분석)
  • ④ 컨테이너는 서블릿 service() 메소드를 호출하며, POST, GET여부에 따라 doGet() 또는 doPost()가 호출된다.
  • ⑤ doGet() or doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse객체에 응답을 보낸다.
  • ⑥ 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.
DD (배포서술자, Deployment Descriptor) = web.xml
  • Servlet, Error Page, Listener, Fillter, 보안 설정등 Web Application의 설정 파일이다.
  • URL과 실제 서블릿의 매핑 정보도 담고 있다.
  • 하나의 웹 어플리케이션에 하나만 존재한다.
  • 보통 Web Document Root 디렉토리에 WEB-INF 폴더 아래 web.xml 파일로 존재한다.

1.4 JSP의 동작구조






index.jsp 파일을 작성해서 저장하면 서블릿으로 변환하여 index_jsp.java 로 변환되고 다시 index_java.class로 컴파일 된다.


.java와 .class 파일로 바꾸는 것은 WAS(tomcat)과 JDK에서 내부적으로 처리해준다.


그래서 tomcat server 의 Server path: 를 보면 .metadata 뒤로 .java와 .class 파일이 저장될 위치를 알려주고 있다.


해당경로로 들어가 파일을 읽어보면  jsp소스가 java형식과 class형식의 코드로 재작성된 코드를 볼수 있다.




서블릿 작성 순서


  • Servlet 예제 코드 작성 

  • URL과 Servlet 매핑하기  

  • Tomcat 연동 하기 

  • 서블릿 실행


참조 : http://wiki.gurubee.net


Maven 왜 써야하나



1. 기존방식


레파지토리 관리 문제


프로젝트 폴더의 properties > Java Build Path > Libraries > Add External JARs 를 통해 자신이 필요한 jar 파일을 구해 추가해야 했다.


초기 개발 환경설정에 어려움이 생길 뿐만 아니라 이후 유지보수나 추가개발 시 jar 파일을 다운받고 서로의 버전을 맞춰야 하는 문제가 발생했다.



2. Maven 쓰고 난 다음 방식


https://mvnrepository.com/


접속하여 자신이 필요한 jar 파일 이름 키워드를 검색하면


.jar로 제공되는 많은 maven 정보가 뜨게 되고


메이븐을 사용하여


pom.xml 안에 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.1.11</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>
cs


간단하게 문장 몇줄만 적어주게 되면 Maven Dependencies 안에 .jar 파일을 모두 받아온다.




  • 교착 상태(膠着狀態, 영어: deadlock)란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태를 가리킨다. 예를 들어 하나의 사다리가 있고, 두 명의 사람이 각각 사다리의 위쪽과 아래쪽에 있다고 가정한다. 이때 아래에 있는 사람은 위로 올라 가려고 하고, 위에 있는 사람은 아래로 내려오려고 한다면, 두 사람은 서로 상대방이 사다리에서 비켜줄 때까지 하염없이 기다리고 있을 것이고 결과적으로 아무도 사다리를 내려오거나 올라가지 못하게 되듯이, 전산학에서 교착 상태란 다중 프로그래밍 환경에서 흔히 발생할 수 있는 문제이다. 


  • 프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다. 


프로세스 상태



커널 내에는 준비 큐, 대기 큐, 실행 큐 등의 자료 구조가 있으며 커널은 이것들을 이용하여 프로세스의 상태를 관리한다.

  • 생성(create) : 프로세스가 생성되는 중이다.
  • 실행(running) : 프로세스가 CPU를 차지하여 명령어들이 실행되고 있다.
  • 준비(ready) : 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다.
  • 대기(waiting) : 보류(block)라고 부르기도 한다. 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태를 말한다.
  • 종료(terminated) : 프로세스의 실행이 종료되었다.


  • 스레드와 멀티스레드


스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.


  • 해시맵


HashMap이란 Map인터페이스의 한종류로써 Key와 Value 값으로 데이터를 저장하는 형태를 가지고 있다.


Map은 키(Key), 값(Value) 을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스들을 구현하는 데 사용된다.


쉽게 말해 key, value 값으로 저장하는 List 와 비슷하다.


  • REST


Representational safe transfer (REST)는 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍처이다.

REST 원리를 따르는 시스템은 종종 RESTful이란 용어로 지칭된다.

영어의 접미사인 ful이란 단어는 가득한 풍부한이라는 뜻이다. REST가 가득하다는 뜻이다.


REST는 요소로는 크게 리소스,메서드,메세지 3가지 요소로 구성된다.


예를 들어서 “name이 sanghyun인 users를 생성한다” 라는 호출이 있을 때


"users" 는 생성되는 리소스, 

"생성한다" 라는 행위에 POST 메서드,

"name이 sanghyun인 users" 는 메시지가 된다


이를 REST 형태로 표현해보면


HTTP POST , http://localhost/users/


1
2
3
4
5
{  
   "users":{  
      "name":"sanghyun"
   }
}
cs


REST에서는 행위에 대한 메서드를 HTTP 메서드 그대로 사용한다.

HTTP 에는 여러가지 메서드가 있지만 REST에서는 CRUD(Create Read Update Delete)에 해당 하는 4가지의 메서드만 사용한다.

REST의 리소스

REST는 리소스 지향 아키텍쳐 스타일이라는 정의 답게 모든 것을 리소스 즉 명사로 표현을 하며, 각 세부 리소스에는 id를 붙인다.

즉 사용자라는 리소스 타입을 http://localhost/users라고 정의했다면, sanghyun이라는 id를 갖는 리소스는 http://localhost/users/sanghyun 의 형태이다.
REST의 리소스가 명사의 형태를 띄우다 보니, 명령(Operation)성의 API를 정의하는 것에서 혼돈이 올 수 있다.

예를 들어서 “Push 메서지를 보낸다”는 보통 기존의 RPC(Remote Procedure Call)이나 함수성 접근해서는 /localhost/sendpush 형태로 잘못 정의가 될 수 있지만, 이러한 동사형을 명사형으로 바꿔서 적용해보면 리소스 형태로 표현하기가 조금더 수월해 진다.

“Push 메시지 요청을 생성한다.”라는 형태로 정의를 변경하면, API 포맷은 POST/localhost/push 형태와 같이 명사형으로 정의가 될 수 있다. 물론 모든 형태의 명령이 이런 형태로 정의가 가능한 것은 아니지만, 되도록이면 리소스 기반의 명사 형태로 정의를 하는게 REST형태의 디자인이 된다. 

REST API의 간단한 예제

그러면, 간단한 REST API의 예제를 살펴보도록 하자 간단한 사용자 생성 API를 살펴보면

1. 생성

다음은 http://localhost/users 라는 리소스를 이름은 sanghyun, 취미는 game 이라는 내용(메시지)로 HTTP Post를 이용해서 생성하는 정의이다. 

HTTP Post, http://localhost/users/


1
2
3
4
{  
   "name":"sanghyun",
   "hobby":"game"
}
cs

2. 조회

생성된 리소스 중에서 http://localhost/users 라는 사용자 리소스중에, id가 sanghyun인 사용자 정보를 조회해오는 방식이다. HTTP Get을 사용한다.

HTTP Get, http://localhost/users/sanghyun



3. 업데이트

http://localhost/users 라는 사용자 리소스중에, id가 sanghyun인 사용자 정보에 대해서, 취미를 “piano”로 수정하는 방식이다. 수정은 HTTP 메서드 중에 PUT을 사용한다.

HTTP PUT, http://localhost/users/sanghyun


1
2
3
4
{  
   "name":"sanghyun",
   "hobby":"piano"
}
cs


4. 삭제

http://localhost/users 라는 사용자 리소스중에, id가 sanghyun 사용자 정보를 삭제 한다.

HTTP DELETE, http://localhost/users/sanghyun



API 정의를 보면 알겠지만 상당히 간단하다. 단순하게 리소스를 URI로 정해준 후에, 거기에 HTTP 메서드를 이용해서 CRUD를 구현하고 메시지를 JSON으로 표현하여 HTTP Body에 실어 보내면 된다. POST URI에 리소스 id가 없다는 것을 빼면 크게 신경쓸 부분이 없다. 


HTTP


Web-Browser(브라우저)같은 응용프로그램을 통해 


Web-Client(사용자)와 Web-Server(서비스제공자)사이 


데이터를 전송하는 프로토콜이다.



1. HTTP는 TCP/IP를 이용하는 응용 프로토콜이다.


   컴퓨터와 컴퓨터 간 데이터 전송


2. HTTP는 연결 상태를 유지하지 않는 프로토콜이다.


   연결이 지속적이지 않기에 Web-Client와 연결 종료 후


   추가적인  Web-Client의 요청시 어떤 Web-Client이 요청인지 모른다는 점 발생해


   Cookie, Session, URL Rewriting, Hidden Form Field로 해결



   HTTP와 반대로 연결 상태 유지는 프로토콜은 FTP, Telnet이 있다.(TCP/IP)

   


3. HTTP는 연결 상태를 유지하지 않는 프로토콜이기 때문에 


   요청/응답(request/response)방식으로 동작한다.


   


참고 :


https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4

http://bcho.tistory.com/953

'전체 > 개발지식' 카테고리의 다른 글

Spring 개발 구성 및 파일 디렉토리 구조  (0) 2018.10.04
open <tag> in XML mapper - mybatipse plugin 사용하기  (3) 2018.02.21
Servlet 정의  (0) 2017.05.15
Maven을 쓰는이유  (1) 2017.05.12
Mybatis를 쓰는 이유  (1) 2017.05.12


1. Mybatis란 무엇인가?


사실 JDBC라는 개념부터 알아야한다.

JDBC란 Java에서 DB와 연동하고 쓰기위해 사용하는 API이다.


JDBC는 DB 연동에 필수적으로 사용하는 것인데


이 JDBC만 사용해서 DB 쿼리문을 작성하면 java소스와 쿼리소스가 겹치게 되고 관리가 어려워진다.


Mybatis는 SQL 쿼리문을 xml 형식의 파일로 분리시켜 저장관리할 수 있고 java소스에서 xml 태그의 id만 호출하며 개발의 편리함을 제공한다.


Mybatis는 xml형식의 쿼리파일을 저장 및 호출하는 역할을 내부적으로 처리하는 것이다.



2. 왜 쓰고 있나?


Mybatis 없었을 때 소스 방식


1
2
3
4
5
6
7
8
9
10
11
12
13
public Entity selectFAQList(UserConnection conn, Entity param) throws SQLException {
    UserStatement stmt = null;
    ResultSet rslt = null;
    StringBuffer sql = new StringBuffer();
    sql.append("\n SELECT *");
    sql.append("\n FROM");
    sql.append("\n TABLE1");
    stmt = conn.prepareStatement(sql.toString());
    rslt = stmt.executeQuery();
    Entity _DATA = new Entity();
    _DATA.put("_DATA", EntityUtil.ResultSetToClobList(rslt));
    return _DATA;
}
cs


소스를 보면 .java 파일안에 StringBuffer라는 클래스를 호출해 sql이라는 객체를 만들어 문자를 계속 이어주면서 sql query를 작성하고 있다.


다 작성한 다음 작성 된 쿼리를 다른 메소드의 파라미터로 넘기고 리턴하고 있다.


이러한 방식은 쿼리가 수정될 때 마다 계속 .java에 들어가 .append() 메소드를 추가하고 저장해 유지보수가 힘들고 sql query구문의 분리가 어려지고 복잡해진다.


또한 쿼리 양이 많아질수록 .java에는 자바코드 뿐만아니라 쿼리코드로 인해 양이 방대해지는 문제가 발생한다.


아 이래선 도저히 안된다. 유지보수도 해야되고 추가개발도 해야되므로 sql구문과 java코드의 분리 필요성을 느끼게 된다.


Mybatis 적용 후 소스 방식


1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
  <ENTITY id="table.getTable1List" type="SQL" return="List">
    <![CDATA[
        SELECT *
            FROM
            TABLE1
    ]]>
    <PARAMS>    
    </PARAMS>
  </ENTITY>
cs


xml로 빼내서 쿼리문을 작성하면 내부적 처리는 Mybatis에서 모두 처리해주므로


Entity Id 값을 java에서 호출만하면 된다. 




+ Recent posts