728x90
300x250

[이야기] Maven, Oracle 19, Hibernate 5.4 - ORM 구현 및 동작하나요?


인터넷 글 등을 참고해보면, 대다수 검색되는 내용이 "Spring + Maven + Hibernate + MySQL" 조합의 글들이 굉장히 많이 나온다.

해외 사이트를 찾아서 참고해보면, "Maven + Hibernate + MySQL" 조합도 종종 나온다.

StackOverflow에 Oracle 19g와 Hibernate를 사용할 때 Dialect을 어떤 것을 사용해야 하는지 검색을 해보았다.

Oracle 12버전으로 하면 된다고 해서 시도하였으나 동작하지 않았다.



* 오라클로 작업을 하고자 하는 인원이 있다면, 참고하면 좋겠다.


* 결론: 수 차례 실험 결과로는 동작하지 않는다. (2020-09-20일 기준)



- 오라클 데이터베이스 자체가 전혀 안 된다는 이야기는 아니고, Dialect 등이 엄격하게 버전을 인식하는 것으로 추측해본다.
  (실험을 해보면 Oracle 11, Oracle 12로 시도했을 때는 될 수도 있다는 이야기를 하고 싶었다.)
- 물론 시간적인 여력이 된다면, 연재해보겠다. 

  (오라클 제거하고, 컴퓨터 포멧이나 VirtualBox 등 각종 방법으로 실험을 한다고 했을 때 시간이 소요되는 작업이다. 결코 쉽지않은 작업들이다.)




1. 작업화면


수 차례 실험하였으나 동작하지 않는다.



그림 1. hibernate Maven 프로젝트




2. 실험 환경


* 컴퓨터 사양: intel i5 4세대 이상, SSD 256GB 이상, RAM 16GB 이상

* 시도 횟수: 4번(hibernate 초기 로드시간이 상당히 오래 걸림.) - 코드 작성 / 재작업 등 각종 숨은 디버깅 작업이 있었음.

              데이터베이스 테이블도 구현하였고 각종 작업을 하였음.


* IDE: Spring-tool-suite-4-4.7.2 Release(Eclipse)

     Jboss - hibernate만 설치


* POM:

      java-servlet

      hibernate-em(entity-manager)

      oracle-19g(ojdbc8)


* Database: 

      Oracle Databases 19g


* Web Server:

      Apache Tomcat 9


* 환경설정 파일 생성: Jboss - hibernate로 자동 생성하였음. (src/main/resources 폴더 내에 hibernate.cfg.xml 설치함)


* 프로젝트


   - [첨부(Attachments)]

hibernateMaven.zip


특이한 점: 초기 웹서버를 리셋하고, URL주소를 입력하여 DB에 접근하면 무한 반응으로 대기상태에 한참 있다가 hibernate 동작에서 

한참 대기 후에 결과가 나옴.


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

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

                                         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

 <session-factory name="">

  <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

  <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>

  <property name="hibernate.connection.username">사용자계정</property>

  <property name="hibernate.connection.password">비밀번호</property>

  <property name="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</property>

  <property name="hibernate.show_sql">true</property>

  <property name="hibernate.use_sql_comments">true</property>

  <property name="hibernate.format_sql">true</property>

  <mapping class="com.hibernateMaven.web.model.EmpTable"/>

 </session-factory>

</hibernate-configuration>


* 파일명: hibernate.cfg.xml

* 비고: Dialect이 지원될 때까지는 기다려야 할 것으로 보인다. 이전 Dialect으로 연결 시도를 해도 된다는 Stackoverflow 글도 참고하였으나 확인되진 않았다.

        (2020-09-21)



그림 2. JBoss Tools 4.16.0. Final



그림 3. Maven Project 생성 모습의 예



그림 4. 프로젝트 오른쪽 버튼 -> New -> Other....



그림 5. Hibernate 환경설정 파일 - 마법사 (JBoss 기반)



그림 6. Hibernate 환경설정 파일 - 마법사 (JBoss 기반)




그림 7. Hibernate 환경설정 파일 - 마법사 (JBoss 기반)



그림 8. Hibernate 환경설정 파일 생성된 모습


JBoss - Hibernate 플러그인을 설치하면, GUI화면으로도 작업할 수 있다.



그림 9. Hibernate 환경설정(GUI)으로 Mapping 시도하는 모습


실험하면서 동작하였으면, 좋은 글 하나 나왔을 탠데 아쉽다는 조금 생각이 든다.


현재 시중 블로그에 제대로 동작하는 Hibernate + Maven + Oracle 18 이상의 프로젝트는 없다고 보면 정확할 거 같다.

OpenTutorial 이런 강의 사이트 동영상도 참고해보기도 하고, 많은 시간을 투자하였다.





3. 결론(Conclusion)


안 될 때는 과감하게 정리해야 한다. 시도해볼만한 삽질이라면, 해야 하는게 맞지만, 오래 시도하기에는 애매한 작업들이 있다.


Hibernate보다는 MyBatis가 좋다고 보는게, 직관적으로 SQL 문법을 자유롭게 사용할 수 있다는 게 큰 장점이라고 본다.

ORM(객체-관계-맵핑)이라는 주제도 물론 중요하지만, 그거 필요하면 코드로 그냥 구현해서 사용하는 게 더 이득이고 낫다고 주장해본다.


엔터프라이즈 환경에 적합하다고 적은 교과서도 시중에 있긴 있는데, 꼭 그렇진 않은 거 같다고 본다.

서버 튜닝으로 막아도 무방하고, MySQL 이런 것도 예를 들면 튜닝이나 Cluster 등 다양한 방법론을 잘 적용하면 엔터프라이즈에서도 사용할 수 있다고 본다.


SQL 문법이 크게 어려운 것이 아니니깐, ORM은 여전히 시기상조라고 주장해본다.

더 복잡해지고 개발환경이나 생산성에서 미흡한 점이 여전히 남아 있다.

반응형
728x90
300x250

[JSP] 9. MVC 디자인 패턴 - 초간단 이해, FrontController 패턴(1)


이전의 글을 보면, 순수하게 "JSP/서블릿"으로 처리하는 방법에 대해서 소개하고 있는데, 실질적으로 개발에서 자주 사용할 수 있는 패턴에 대해서 소개해보려고 한다.


기존 개발에 대해서 다시 한번 생각해보도록 하자.



그림 1. 기존 개발방법론의 문제점 - 요약


기존 개발방법론을 살펴보면, 크게 JSP, Servlet 처리에 대해서 하나의 코드 안에 "개발 코드(액션 코드 또는 동적 코드)", "사용자 인터페이스(UI)" 등이 혼잡되어 구현되는 문제가 있을 수 있다.


Servlet을 사용해보면 알겠지만, 자바 코드 내에서 홈페이지 코드라고 불리는 html, css 등을 넣어준다는 게 보통 쉬운 일이 아니다.

물론 저레벨의 C언어 등으로 개발해보면, 언어 특성 때문에 어쩔 수 없이 MVC 개발이 어려운 경우가 있을 수도 있다.


이야기하고자 하는 것은 MVC패턴으로 개발을 하게 되는 배경은 "소프트웨어공학"에서 유지보수 차원의 문제부터 역할 전문화 등의 각종 공학적인 문제 때문에 패턴이라는 게 생겼을 것으로 보인다.


[첨부(Attachments)]

200920_Diagram1.pptx




1. 디자인 패턴이란?


디자인 패턴은 프로그램을 개발할 때 사용하는 일정한 뼈대(프레임) 또는 틀이라고 생각하면 된다.


디자인 패턴만 전문적으로 다루고 있는 참고서적이나 참고 사이트가 있는데 찾아보면 도움이 될 것이라고 본다.

(다소 처음에는 이해가 안 될 수도 있음. 개발을 조금 해봐야 필요성을 인지하게 된다.)





2. Model View Controller (MVC) 디자인 패턴


php나 asp 개발을 해보면, 디자인패턴이 초기에 바로 적용되진 않는다. 

물론 최근에는 aspx(asp.net)의 경우에는 model 1, model 2 느낌의 개발이 적용되어 있다고 본다.

이유는 간단한게 C#의 직접적인 경쟁자는 Java 프로그래밍 언어라는 점이다.


Java 진영의 JSP 개발을 하게 되면, MVC 패턴의 적용을 먼저 시작하고 들어가게 된다.


그림 2. MVC Model 1, MVC Model 2 구조


도식화된 그림으로 이해하고 있어도 무방하다. 그림 1에서 언급했던 이야기는 그림 2로서 정리해볼 수가 있다.


[첨부(Attachments)]

200920_Diagram2.pptx


현재에도 Model 1이 사용되는 이유로는 장점이 있다.

초기 개발 속도에 있어서는 빠를 수가 있다.

무슨 이야기냐면, 컨트롤러와 뷰 영역을 신경쓰지 않고 개발하기 때문에 어렵게 공부하고 개발할 필요가 없는 것이다.

JSP 코드나 Servlet 코드 내에 통합적으로 코드를 집어넣으면 되는데, 굳이 컨트롤러를 복잡하게 매번 신경쓰고 개발하지 않아도 되는
프로젝트가 있을 수 있다.

Model2는 설계가 어려운 반면, 유지보수로 갔을 때는 역할 구분이 쉽다는 장점을 가지고 있다.


이전의 방법과 현재의 방법에서 적절한 방법을 찾아서 적용하는 것도 중요하다고 본다.


* 모델은 서비스와 데이터베이스 처리를 담당하는 역할을 하며, 각 로직처리, DB 질의 처리 기능을 수행한다.

* 는 JSP, CSS, HTML를 사용하여 구현함. 

* 컨트롤러는 뷰와 모델을 중개하는 역할을 수행하며, 클라이언트가 전달한 파라마터를 추출하여 모델로 전달하고, 처리결과를 보여주는 기능을 한다.



3. Eclipse의 Dynamic Web Project로 구현해보기


Apache Maven을 활용하면, 속도감이 있게 구현할 수 있겠으나 원초적인 방법으로 구현해보려고 한다.



그림 3. Dynamic Web Project - 생생하기


New 메뉴에서 Project -> Others를 누르면 위의 화면이 뜬다.

Web 폴더에서 Dynamic Web Project를 선택한 후 Next를 누른다.




그림 4. Dynamic Web Project - 생생하기


프로젝트 명을 입력하고 Next를 누른다.

Finish를 눌러도 무방하나 web.xml 파일을 자동으로 생성하려고 한다.



그림 5. Dynamic Web Project - 생생하기


Next를 누른다.



그림 6. Dynamic Web Project - 생생하기


Generate web.xml deployment descriptor에 체크를 한 후 Finish를 누르면 web.xml이 포함된 신규 프로젝트가 생성되는 것을 확인할 수 있다.



그림 7. Dynamic Web Project - 생생하기


성공적으로 신규 프로젝트가 생성되었다.



4. web.xml 설정하기


Front Controller 패턴을 적용하기 위해서 Web.xml 파일을 살짝 수정해주어야 한다.



그림 8. web.xml 수정하기


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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>edu-jsp-MVC</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

  </welcome-file-list>

  

<!-- Front Controller 패턴 -->

<servlet>

<servlet-name>front</servlet-name>

<servlet-class>com.eduJsp.controller.FrontController</servlet-class>

<init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>front</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

  

</web-app>


[소스 코드]


[첨부(Attachments)]

web.zip




5. FrontController 생성하기(서블릿) - Controller


FrontController 패턴의 초기 컨트롤러를 생성하겠다.


그림 9. Servlet 만들기 - FrontController 생성


Java Resources를 오른쪽 버튼으로 클릭한다.

New-> Servlet을 클릭한다.



그림 10. Servlet 만들기 - FrontController 생성


Java Package 명은 com.eduJsp.controller로 입력한다.

Class Name 명은 FrontController로 입력한다.

Next를 누른다.



그림 11. Servlet 만들기 - FrontController 생성


Next를 누른다.



그림 12. Servlet 만들기 - FrontController 생성


init, service만 체크해준다.

Finish를 누른다.




그림 13. Servlet-API 복사, 붙여넣기 하기


servlet-api 파일을 apahce-tomcat 설치 경로에서 lib 폴더에서 찾아보면 파일이 있다.

프로젝트의 WEB-INF/lib 폴더에 "복사, 붙여넣기"를 해준다.





6. Controller 인터페이스 생성하기 - Controller


Controller에 대한 인터페이스에 관한 것이다.

공통적으로 사용할 인터페이스이니 지정을 한번 해주면 된다.



그림 14. Interface 만들기


"com.eduJsp...." 폴더에서 오른쪽 버튼을 클릭한다.

New->Interface를 클릭한다.



그림 15. Interface 만들기


"Name(파일명)"을 Controller로 입력한다.

Finish를 누른다.



그림 16. Interface 만들기


package com.eduJsp.controller;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public interface Controller {


public void execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException;

}


* 파일명: Controller.java


[첨부(Attachments)]

Controller.zip




7. AddressInsertController와 AddressListController - Controller


이번에 수행할 작업은 앞서 6에서 생성한 Controller 인터페이스를 바탕으로 List, Insert 컨트롤러를 만들어보도록 하겠다.



그림 17. Controller 구현부 - 만들기


com.eduJsp 오른쪽 버튼 -> New -> Class를 누른다.




그림 18. Controller 구현부 - 만들기


두 개를 만들어야 함. (그림 17, 그림 18과정 - 반복)
- ClassName(클래스명): AddressInsertController

- ClassName(클래스명): AddressListController


클래스를 두개 만들어준다.

참고로 클래스를 생성할 때 Interfaces를 Add하여 Finish를 누르면 메서드(Method)가 자동으로 생성된다.



8. FrontController.java 코드 작성하기(서블릿) - Controller


앞서 작성한 컨트롤러(인터페이스)를 바탕으로 FrontController를 작성해보겠다.



그림 19. FrontController.java 코드 작성


package com.eduJsp.controller;


import java.io.IOException;

import java.util.HashMap;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class FrontController extends HttpServlet {

private static final long serialVersionUID = 1L;

    

private String charset = null;

private HashMap<String, Controller> list = null;

    public FrontController() {

        super();

    }


    @Override

public void init(ServletConfig sc) throws ServletException {

    charset = sc.getInitParameter("charset");

    list = new HashMap<String, Controller>();

   

    list.put("/board/insert.do", new AddressInsertController());

    list.put("/board/list.do", new AddressListController());

   

}


    @Override

protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


    req.setCharacterEncoding(charset);

    String url = req.getRequestURI();

    String contextPath = req.getContextPath();

    String path = url.substring(contextPath.length());

   

    Controller subController = list.get(path);

    subController.execute(req, res);

   

}


}



* 파일명: FrontController.java


[첨부(Attachments)]

FrontController.zip




9. HttpUtil 코드 작성하기(서블릿) - Controller


RequestDispatcher가 해당 주제에서는 핵심이라고 보면 되겠다.

앞서 작성한 AddressListController나 AddressInsertController 등에서 jsp파일 경로 등을 요청했을 때, 작업을 처리해주는 역할을 수행한다.



그림 20. HttpUtil 코드 작성


com.eduJsp 폴더를 오른쪽 버튼한다.

New->Servlet을 클릭한다.




그림 21. HttpUtil 코드 작성


Class Name은 HttpUtil로 지정한다.

Next를 누른다.



그림 22. HttpUtil 코드 작성


Next를 누른다.




그림 23. HttpUtil 코드 작성


service만 체크하고 Finish를 누른다.

함수 원형을 생성하기 귀찮아서 하나만 선택하였다.

참고로 다음 작업에서는 함수 원형을 살짝 수정할 것이다.




그림 24. HttpUtil 코드 작성



package com.eduJsp.controller;


import java.io.IOException;


import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class HttpUtil extends HttpServlet {

private static final long serialVersionUID = 1L;

       

public static void forward(HttpServletRequest req, HttpServletResponse res, 

String path) throws ServletException, IOException {

try {

RequestDispatcher dispatcher = req.getRequestDispatcher(path);

dispatcher.forward(req, res);

}catch(Exception ex) {

System.out.println("forward 오류:" + ex);

}


}


}



* 파일명: HttpUtil.java


[첨부(Attachments)]

HttpUtil.zip




10. addressList.jsp, addressInsert.jsp 파일 생성하기 - View (뷰 영역 만들기)


이번 작업에서는 뷰 영역을 만들어주겠다.



그림 25. 뷰 생성하기


WebContent 폴더에서 오른쪽 버튼을 클릭한다.

New->JSP File을 클릭한다.




그림 26. 뷰 생성하기


File name은 addressList로 입력한 후 Finish를 누른다.



그림 27. 뷰 생성하기


File name은 addressInsert로 입력한 후 Finish를 누른다.


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>목록 - MVC 페이지</title>

</head>

<body>

<h3>목록 - MVC 페이지</h3>

</body>

</html>


* 파일명: addressList.jsp


[첨부(Attachments)]

addressList.zip


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>삽입 - MVC 페이지</title>

</head>

<body>

<h3>삽입 - MVC 페이지</h3>

</body>

</html>


* 파일명: addressInsert.jsp


[첨부(Attachments)]

addressInsert.zip



11. AddressInsertController.java, AddressListController.java


AddressInsertController.java, AddressListController.java 파일에 관한 것이다.


package com.eduJsp.controller;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class AddressInsertController implements Controller {


@Override

public void execute(HttpServletRequest req, HttpServletResponse res) throws

ServletException, IOException{


HttpUtil.forward(req, res, "/WEB-INF/view/addressInsert.jsp");

}


}


* 파일명: AddressInsertController.java


package com.eduJsp.controller;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class AddressListController implements Controller {


@Override

public void execute(HttpServletRequest req, HttpServletResponse res) throws

ServletException, IOException {

HttpUtil.forward(req, res, "/WEB-INF/view/addressList.jsp");

}


}


* 파일명: AddressListController.java



12. 결과


서버에 올려서 확인해보면, 아래와 같은 결과를 출력해볼 수 있다.



그림 28. 출력하기 - 결과(1)



그림 29. 출력하기 - 결과(2)



13. UML 설계(Controller 설계)


"bottom->top" 방식으로 UML 결과를 보여주도록 하겠다.



그림 30. UML 설계도 - edu-jspMVC 프로젝트


예를 들면, 이러한 설계도를 바탕으로 코드를 작성하기에 앞서 한번 더 생각해볼 수 있다.

물론 코드 학습에 있어서는 직접 짜봐야 감이 오는 건 분명하다.


* UML 작성 프로그램: Modelio Open Source 4.0



14. 질의처리 및 로직에 관한 영역 - Model 영역(선택)


모델은 서비스와 데이터베이스 처리를 담당하는 역할을 하며, 각 로직처리, DB 질의 처리 기능을 수행한다.

패키지를 기준으로 보면, com.edu-jspMVC.service에 해당된다고 보면 된다.


모델 영역은 데이터베이스를 사용하지 않거나 복잡한 로직을 구현할 일이 없다면, 선택으로 둬도 무방할 것 같다.


14-1. VO(Value Object) - Model 영역(선택)


정보를 저장할 목적으로 만든 VO(Value Object) 객체라고 정의할 수 있다.


* tableName(테이블명): addressbook


 키

 항목명

 속성 

 PK(기본키)

num

인덱스(ID)

 

name

nvarchar2(20)

 

address

nvarchar2(100)

 

birthdate

date


표 1. addressbook 테이블


package com.eduJsp.vo;


import java.sql.Date;


public class AddressVO {

private int num;

private String name;

private String address;

private Date birthdate;

public int getNum() {

return num;

}

public void setNum(int num) {

this.num = num;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public Date getBirthdate() {

return birthdate;

}

public void setBirthdate(Date birthdate) {

this.birthdate = birthdate;

}

}


* 파일명: AddressVO.java


[첨부(Attachments)]

AddressVO.zip




14-2. Service 설계 - Model 영역(선택)


클래스명은 "AddressService" 이런 형태로 파일을 구성하여 사용하면 된다.

인터페이스를 설계해도 무방하다.


package com.eduJsp.service;


import java.util.List;


import com.eduJsp.vo.AddressVO;


public interface IAddress {


public AddressVO getAddress(Integer num) ;

public List<AddressVO> allData();

public int insertAddress(AddressVO addressVO);

public int updateAddress(AddressVO addressVO);

public int deleteAddress(AddressVO addressVO);

}


* 파일명: IAddress.java


[첨부(Attachments)]

IAddress.zip


package com.eduJsp.service;


import java.util.List;

import com.eduJsp.vo.AddressVO;


public class AddressService implements IAddress{


@Override

public AddressVO getAddress(Integer num) {

return null;

}


@Override

public List<AddressVO> allData() {

// TODO Auto-generated method stub

return null;

}


@Override

public int insertAddress(AddressVO addressVO) {

// TODO Auto-generated method stub

return 0;

}


@Override

public int updateAddress(AddressVO addressVO) {

// TODO Auto-generated method stub

return 0;

}


@Override

public int deleteAddress(AddressVO addressVO) {

// TODO Auto-generated method stub

return 0;

}

}



* 파일명: AddressService.java


[첨부(Attachments)]

AddressService.zip




14-3. DAO(Data Access Object) - Model 영역(선택)


데이터베이스 처리에 관한 실질적인 코드를 구현하는 곳이다.

현재 프로그램들의 대부분은 DB를 사용하지만, 꼭 사용해야 하는 것은 아니다.


패키지를 기준으로 보면, "com.edu-jspMVC.dao"에 해당된다고 보면 된다.

예를 들면, 클래스명 "AddressDAO" 이런 형태로 파일을 구성하여 사용하면 된다.


여기 부분에 예를 들면, Resultset, Preparedstatement, Connection 등의 기능을 활용하여 SQL문장 등을 정의하는 것이다.


package com.eduJsp.dao;


import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;


import com.eduJsp.vo.AddressVO;


public class AddressDAO {


    public AddressVO selectAddress(Integer num) {


    Connection conn = null;

    PreparedStatement pstmt = null;

    ResultSet rs = null;

   

    AddressVO node = new AddressVO();

   

    String sql = "select NUM, NAME, ADDRESS, BIRTHDATE " +

      " from addressbook" + 

      " where num=?";

    System.out.println(sql);

   

    // 달력 날짜 출력 버그 개선

   

    try {

    //conn = session.connect();

   

    pstmt = conn.prepareStatement(sql);

    pstmt.setInt(1, num);

   

    rs = pstmt.executeQuery();

   

    if ( rs.next() ) {

    node.setNum(rs.getInt(1));

    node.setName(rs.getNString(2));

    node.setAddress(rs.getNString(3));

    node.setBirthdate(rs.getDate(4));

    }

   

   

    }catch(Exception ex) {

    System.out.println("오류 발생: " + ex);

    }

    finally {

    // session.close(conn, pstmt, rs);

    }

   

        return node;


    }

}


* 파일명: AddressDAO.java


[첨부(Attachments)]

AddressDAO.zip




15. MVC 프로젝트 구성도


MVC 프로젝트를 구성한 모습이다.



그림 31. MVC Project 구성


그림 31처럼 이런 형태로 구성된다고 보면 되겠다.



16. 맺음글(Conclusion)


글을 다소 길게 쭉 작성했는데, MVC를 좀 더 정확하게 소개하고 싶어서 그런 점 이해하길 바란다.


MVC 패턴의 원리에 대해서 JSP/Servlet을 기반으로 소개하였다.

예를 들면, Spring Frameworks를 먼저 접하기보다는 순수한 부분에 대해서도 생각해봐야 한다고 본다.



* 참고자료(References)


반응형
728x90
300x250

[컴퓨터 - PC활용] Eclipse - UML, ERD 설계 도구 - Amateras Modeler


소프트웨어 공학 문서 등으로 알기 쉽게 만드는 방법 중 하나가 UML 작업이 아닐까 싶다.

UML 작성을 도와주는 프로그램을 소개하려고 한다.


시중에 있는 좋은 UML도구를 사용하려고 하면, 유료가 굉장히 많다.


UML 프로그램은 크게 "Class Diagram(클래스 다이어그램)", "Sequence Diagram(순서작성 다이어그램)", "ERD(Entity-Relationship Diagram)" 등의
소프트웨어공학 문서를 작성하는데 사용함.



1. Amateras Modeler 소개 및 설치 방법


http://amateras.osdn.jp/cgi-bin/fswiki_en/wiki.cgi


사이트에 접속한다.



그림 1. Project Amateras - 2020-09-20


사이트에 접속해보면, 다양한 제품들이 있다는 것을 확인할 수 있다.

조금 업데이트가 안 되서 오래된 기분이 든다.



그림 2. Help -> Install New Software에서 설치하기


Add Repository 창에서
Name : Amateras Modeler,
Location : https://takezoe.github.io/amateras-update-site 를 입력합니다.

OK 버튼을 누릅니다.


크게 어렵지 않은 과정으로 설치할 수 있다.

(License: Eclipse Public Licenses v2 - 오픈소스)



그림 3. Class Diagram(클래스 다이어그램 생성 기능) - Amateras UML



그림 4. Seq Diagram(시컨스 다이어그램 생성 기능) - Amateras UML




2. UML to Java Generator 3.0


UML to Java Generator라는 도구를 소개하겠다.



그림 5. Help -> Eclipse Marketplace



그림 6. Help -> Eclipse Marketplace(1)


관련된 프로젝트에 대해서 궁금하면, 아래의 사이트에 접속해서 확인할 수 있다.


https://marketplace.eclipse.org/content/uml-java-generator#group-details


읽어봐야 할 부분이 조금 있는 것으로 보인다.



그림 7. UML-Java Generator - Eclipse


Acceleo 개발 팀에 의해서 Eclipse UML Generators Project 파트가 생성되었다고 되어 있다.

Marketplace에서 추가로 "Acceleo 3.7"을 설치해보도록 하겠다.




그림 8. Help -> Eclipse Marketplace(2)


사용 난이도: 다소 어려움. 동작이 안 될 수도 있음. (삽질 시간이 길다)


* License: EPL v2


Acceleo 프로젝트가 어렵다면, UML Designer도 있으니 참고하면 도움이 될 거 같다.


http://www.umldesigner.org/



그림 9. UMLDesigner 사이트에서 배포하고 있는 UML 도구


압축을 해제하면 된다.

프로젝트가 업데이트되지 않은 듯하다.



그림 10. UMLDesigner 사이트에서 배포하고 있는 UML 도구


UMLDesigner를 실행하면 된다.



그림 11. UMLDesigner 9.0 - Eclipse


잠시 기다린다.

사용 원리는 Eclipse와 동일하다.



그림 12. UMLDesigner 9.0 - Eclipse


처음 실행하면 이러한 창이 뜬다.

File->New->Example을 클릭한다.



그림 13. UMLDesigner 9.0 - Eclipse


Travel Agency UML을 선택한 후 Next를 누른다.



그림 14. UMLDesigner 9.0 - Eclipse


Finish를 누른다.



그림 15. UMLDesigner 9.0 - Eclipse


representation.aird의 세부 항목 중 하나를 열어본 것이다.

UML 설계를 할 수 있는 도구라는 것을 살펴볼 수 있다.



그림 16. UMLDesigner 9.0 - Eclipse


프로젝트를 선택한 후 "프로젝트 추가 버튼"에서 UML Model을 클릭한다.



그림 17. UMLDesigner 9.0 - Eclipse


myUMLProject.uml으로 입력 후 Finish를 누른다.



그림 18. UMLDesigner 9.0 - Eclipse


myumlproject.uml에서 Model을 선택한 후 오른쪽 버튼을 누른다.

New Representation을 클릭한 후 NewModel Class Diagram을 클릭한다.




그림 19. UMLDesigner 9.0 - Eclipse


모의로 하나 그려보았다.

설명서를 보면, UML to Java 변환이 가능하다고 되어있으나 현재는 동작되지 않고 있다.



3. Modelio (Open source Modeling Project)


초기 용량은 300Mb 내외로 다소 크지만, 관심을 가져봐도 되는 프로젝트인듯하다.


주소: https://www.modelio.org/



그림 20. Modelio Project - 2020-09-20


Download를 클릭해본다.



그림 21. Modelio Project - 2020-09-20


다양한 운영체제를 지원하는 것을 확인할 수 있다.



그림 22. Modelio Project - 2020-09-20


설치는 크게 어렵지 않으며 Next를 누른다.



그림 23. Modelio Project - 2020-09-20


GNU v3 Licenses를 적용받는다.

I Agree를 누른다.



그림 24. Modelio Project - 2020-09-20


Next를 누른다.



그림 25. Modelio Project - 2020-09-20


Install을 누른다.



그림 26. Modelio Project - 2020-09-20


기다린다.



그림 27. Modelio Project - 2020-09-20


설치가 완료된 모습이다. Finish를 누른다.




3-1. Modelio 초기 실행 및 환경설정


Modelio 프로그램은 크게 기본에 충실하게 생겼다.



그림 28. Modelio 4 실행


File->Create a project를 클릭한다.



그림 29. Modelio 4 - 프로젝트 생성


project name을 입력한다.

Java project에 체크한 후 create the project를 누른다.



그림 30. Modelio 4 - 프로젝트 생성 


잠시 기다린다.



그림 31. Modelio 4 - 프로젝트 환경설정


Configuration -> Modules를 클릭한다.



그림 32. Modelio 4 - 프로젝트 환경설정(Module)


Modules 탭을 클릭한다.

Add를 누른다.

JavaDesigner를 선택한 후 Deploy in the project를 누른다.




그림 33. Modelio 4 - 프로젝트 환경설정(Library)


Libraries 탭을 클릭한다.

Add from update site를 클릭한다.




그림 34. Modelio 4 - 프로젝트 환경설정(Library)


JDK를 체크한 후 Add to project를 누른다.



그림 35. Modelio 4 - 프로젝트 환경설정(Library)


잠시 기다린다.



그림 36. Modelio 4 - 프로젝트 환경설정(Library)


JDK가 등록되었으면, Close를 클릭한다.



3-2. Modelio - 다이어그램 생성하기


Modelio를 이용하여 다이어그램을 생성하는 방법에 대해서 소개하겠다.



그림 37. Modelio 4 - Create Diagram 생성하기


Modelio의 하위 프로젝트 폴더에서 오른쪽 버튼을 클릭한다.

Create diagram을 누른다.



그림 38. Modelio 4 - Create Diagram 생성하기


Class Diagram을 선택한 후 OK를 누른다.



그림 39. Modelio 4 - Create Diagram 생성하기


클래스 다이어그램을 작성하면 된다.





3-3. Modelio - UML to Java generator


패키지, 클래스 항목에 "Java element" Value를 체크한다.



그림 40. Modelio 4 - UML to Java Generator


그리고 UML 아이콘을 눌러준다.


참고사항: Attribute의 value type에서 "HttpServlet" 등으로 변경하거나 null값으로 두면 자동생성이 되지 않는다.




그림 41. Modelio 4 - UML to Java Generator


소스코드가 생성된 것을 확인할 수 있다.


경로를 모르겠다면, configuration 메뉴에서 Modules을 클릭한다.

Informations 탭을 클릭하면, workspaces 경로를 확인할 수 있다.



그림 42. Modelio 4 - UML to Java Generator


생성된 소스코드의 모습이다.




4. 맺음글(Conclusion)


이외에도 StarUML 프로젝트(과거에는 무료였으나 현재는 유료)를 대체할 수 있는 강력한 UML 프로그램이 있는지 정리해보았다.

그나마 기대가 되는 프로젝트는 Modelio 프로그램이라고 본다.

아무쪼록 글을 줄여본다.


참고로 UML툴로 설계한 후에 프로그램 코드로도 일괄 변환작업을 할 수 있다.





* 참고 자료(Reference)


1. FrontPage - Project Amateras, http://amateras.osdn.jp/cgi-bin/fswiki_en/wiki.cgi, Accessed by 2020-09-20, Last Modified 2006

2. Uml to Java Generator | Eclipse Plugins, Bundles and Products - Eclipse Marketplace, https://marketplace.eclipse.org/content/uml-java-generator#group-details, Accessed by 2020-09-20, Last Modified 2020-09-18

3. Acceleo | Home, https://www.eclipse.org/acceleo/, Accessed by 2020-09-20, Last Modified 2020-09-20

4. Download, http://www.umldesigner.org/download/, Accessed by 2020-09-20, Last Modified 

5. 무료 StarUML 대체 프로그램 13개, https://littlecarbb.tistory.com/entry/%EB%AC%B4%EB%A3%8C-StarUML-%EB%8C%80%EC%B2%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-13%EA%B0%9C, Accessed by 2020-09-20, Last Modified 2019-06-26 15:44

-> 비고: UML 관련 프로그램에 대해서 정리가 잘 되어 있음.

반응형
728x90
300x250

[Spring-Framework] 5. 순정 Maven MVC 웹 프로젝트 - 서블릿, Oracle DB


이번에 소개할 프로젝트는 Maven을 활용하여 Oracle 연동에 대해서 소개하려고 한다.


* 미리 준비해야 할 것: Oracle Database 설치되어 있어야 함.

-> 오라클의 경우에는 오라클 데이터베이스가 설치되어야만, pom.xml에서 <dependency>로 불러올 수가 있음.



[글의 주제]

1. 흥미로운 실험 - Spring Framework가 없는 Maven MVC 웹 프로젝트로 Servlet(서블릿) 구성해보기

2. Oracle Database 연결해보기


글의 주제를 2가지로 설정한 이유는 Spring Framework와 Maven을 동일시하는 경우가 있어서 차이를 알아보기 위해서 작성하게 되었다.


[사용 환경]

1. Oracle Databases 19g (2020-09월 기준: 최신버전)

2. OpenJDK (2020-09월 기준: 최신버전)

3. Apache Tomcat 9

4. SpringToolSuite4 (2020-09월 기준: 최신버전)

5. MS Windows 10



1. MVNRepository가 만능인가?


몇 가지 미지원하는 제품도 존재할 수 있다. 참고하면 도움이 될 것이다.



그림 1) MVNRepository 검색하기


https://mvnrepository.com/


접속하여 "Oracle"이라고 검색한다.

Oracle JDBC 를 클릭한다.

최신버전을 선택해본다.



그림 2) MVNRepository - Oracle JDBC 12.1.0.2


Maven 생성 코드가 나왔다.

해당 코드를 복사, 붙여넣기를 pom.xml에 시도 해본다.



그림 3) pom.xml에 적용했을 때 오류


Multiple problems have occur......

Error reading file - oracle-jdbc-12.1.0.2.jar 파일을 읽어올 수 없다고 에러가 발생한다.


이렇게 에러가 출력되었다면, 정상적으로 코드를 입력한 것이다.

오류가 발생하는 원인으로는 오라클 데이터베이스는 상용 소프트웨어이기 때문이다.



2. 프로젝트에서 Maven -> Add Dependency 기능 활용하기


Maven 플러그인의 Add Dependency 기능으로 적용해보려고 한다.



그림 4) Maven의 프로젝트


작업중인 프로젝트를 클릭한다.

오른쪽 버튼을 누른다.

"Maven"-> "Add Dependency"를 클릭한다.



그림 5) Maven의 프로젝트


oracle을 검색한다.

com.oracle.database.jdbc | ojdbc8을 선택한 후 OK를 누른다.



그림 6) Maven의 프로젝트


자동으로 oracle jar파일이 생성되는 것을 확인할 수 있다.

버전을 자세히 보면, 19.3.0.0이라고 적혀져 있다.

오라클 최신 버전이 컴퓨터 내에 설치되어 있어서, 해당 버전을 인식하여 가져온 것으로 보인다.




3. Maven에서의 Java 코드 생성하기


이전의 프로젝트에 비해서 복잡하게 느껴질 수도 있지만, 큰 차이점은 없다고 보면 되겠다.

먼저 AddressDto라는 클래스를 생성해보려고 한다.



그림 7) Class 생성하기


Java Resources에서 오른쪽 버튼을 누른다.

New 항목에서 Class를 클릭한다.



그림 8) AddressDto.java 파일 만들기


Package명을 간단하게 "mavenWeb.db"로 입력하였다.

Name명은 "AddressDto"라고 입력하였다.

다 입력하였으면, "Finish"를 누른다.



그림 9) 코드를 입력한 모습 - AddressDto.java


크게 어렵지 않게 Jsp 프로그래밍에서의 Java 파일 생성한 방법처럼, 동일한 형태로 사용할 수 있다는 것을 알 수 있다.





4. Maven에서의 Servlet 코드 생성하기


이전의 서블릿 작업은 web.xml에서 수정작업을 추가적으로 해줘야만 했었다.

Maven에서 서블릿(Servlet)을 생성하면, 자동으로 web.xml에 입력된다.



그림 10) Java Resources의 오른쪽 버튼 메뉴 모습


Java Resources를 선택한 후 오른쪽 버튼 클릭하여 New->Servlet을 클릭한다.



그림 11) Create Servlet


Java Package명은 "mavenWeb.view"으로 지정하였다.

Class name명은 "BoardListServlet"으로 지정하였다.

완료되었다면, Finish를 누른다.



그림 12) web.xml 파일


파일경로: src/main/webapp/WEB-INF/web.xml


자동으로 <Servlet>과 <Servlet-Mapping>이 등록된 것을 볼 수 있다.



그림 13) BoardListServlet.java 파일


doGet함수와 doPost 등이 자동 생성된 프로그램을 볼 수 있다.

Run을 하여 "아파치 톰캣 서버"를 동작시킨 후 아래처럼 태스트를 해볼 수 있다.



그림 14) Open Browser에서의 서블릿 동작 확인하기


매우 친숙한 화면에서 동작되는 모습을 확인할 수 있다.




5. Oracle DB - 간단하게 연동시키기(프레임워크 X - 순정 JDBC) [소스코드]


JDBC 기반으로 Maven Servlet 프로젝트 작업을 구현하겠다.



그림 15) 프로젝트 구성하기의 예


작업해줄 영역은 크게 mavenWeb.db, mavenWeb.view, WEB-INF내의 web.xml 파일이 되겠다.


* 이전 게시글(동일하거나 참고하면 되는 게시글):

1. [JSP] 영속프레임워크 MyBatis를 활용한 CRUD 구현 - JSP와 Oracle, https://yyman.tistory.com/1390?category=810693, 2020-09-19 01:31

-> 비교해서 읽어 보기: 현재 게시글에서는 프레임워크 없이 JDBC 처리에 대해서 소개하고 있음.




package mavenWeb.db;


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;


public class SqlMapSessionFactory {


private static SqlMapSessionFactory factory = new SqlMapSessionFactory();

private SqlMapSessionFactory() {}

public static SqlMapSessionFactory getInstance() {

return factory;

}

public Connection connect() {

Connection conn = null;

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "사용자명", "비밀번호");

}

catch(Exception ex) {

System.out.println("오류 발생: " + ex);

}

return conn;

}

public void close(Connection conn, PreparedStatement ps, ResultSet rs) {

if ( rs != null ) {

try {

rs.close();

}

catch(Exception ex) {

System.out.println("오류 발생: " + ex);

}

close(conn, ps); // Recursive 구조 응용(재귀 함수)

}

}

public void close(Connection conn, PreparedStatement ps) {

if (ps != null ) {

try {

ps.close();

}

catch(Exception ex) {

System.out.println("오류 발생: " + ex);

}

}

if (conn != null ) {

try {

conn.close();

}

catch(Exception ex) {

System.out.println("오류 발생: " + ex);

}

}

}

}



* 파일명: SqlMapSessionFactory.java


[첨부(Attachments)]

SqlMapSessionFactory.zip


package mavenWeb.db;


import java.sql.Date;


public class AddressDto {


private int num;

private String name;

private String address;

private Date birthdate;

public int getNum() {

return num;

}

public void setNum(int num) {

this.num = num;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public Date getBirthdate() {

return birthdate;

}

public void setBirthdate(Date birthdate) {

this.birthdate = birthdate;

}


}



* 파일명: AddressDto.java


비고: 이전 프로젝트와 동일함. (MyBatis 게시글과 흡사함)

java.sql.Timestamp에서 java.sql.Date로 변경함.


[첨부(Attachments)]

AddressDto.zip


package mavenWeb.db;


public interface Address {


public AddressDto getAddress(Integer num);

public int updateAddress(AddressDto addressDTO);

public int insertAddress(AddressDto addressDTO); 

public int deleteAddress(Integer num);

}


* 파일명: Address.java (인터페이스)


비고: 이전 프로젝트와 동일함. (MyBatis 게시글과 동일함)


[첨부(Attachments)]

Address.zip


package mavenWeb.db;


public class AddressImpl implements Address {


@Override

public AddressDto getAddress(Integer num) {

AddressDao dao = AddressDao.getInstance();

return dao.selectAddress(num);

}


@Override

public int updateAddress(AddressDto addressDTO) {

AddressDao dao = AddressDao.getInstance();

return dao.updateAddress(addressDTO);

}


@Override

public int insertAddress(AddressDto addressDTO) {

AddressDao dao = AddressDao.getInstance();

return dao.insertAddress(addressDTO);

}


@Override

public int deleteAddress(Integer num) {

AddressDao dao = AddressDao.getInstance();

return dao.deleteAddress(num);

}


}



* 파일명: AddressImpl.java


비고: 이전 프로젝트와 동일함. (MyBatis 게시글과 동일함)


[첨부(Attachments)]

AddressImpl.zip


package mavenWeb.db;


import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.text.SimpleDateFormat;

import java.util.Calendar;


public class AddressDao {

private AddressDao() {}

    private static AddressDao dao;

    private static SqlMapSessionFactory session; 


    public static AddressDao getInstance(){


        if(dao == null){

            dao = new AddressDao();

            session = SqlMapSessionFactory.getInstance();

        }


        return dao;

    }

    


    public AddressDto selectAddress(Integer num) {


    Connection conn = null;

    PreparedStatement pstmt = null;

    ResultSet rs = null;

   

    AddressDto node = new AddressDto();

   

    String sql = "select NUM, NAME, ADDRESS, BIRTHDATE " +

      " from addressbook" + 

      " where num=?";

    System.out.println(sql);

   

    // 달력 날짜 출력 버그 개선

   

    try {

    conn = session.connect();

    pstmt = conn.prepareStatement(sql);

    pstmt.setInt(1, num);

   

    rs = pstmt.executeQuery();

   

    if ( rs.next() ) {

    node.setNum(rs.getInt(1));

    node.setName(rs.getNString(2));

    node.setAddress(rs.getNString(3));

    node.setBirthdate(rs.getDate(4));

    }

   

   

    }catch(Exception ex) {

    System.out.println("오류 발생: " + ex);

    }

    finally {

    session.close(conn, pstmt, rs);

    }

   

        return node;


    }

    

    public int updateAddress(AddressDto addressDTO) {


    Connection conn = null;

    PreparedStatement pstmt = null;

    int result = -1;

   

    String sql = "update addressbook set NAME = ?, ADDRESS = ?, BIRTHDATE = ? " + 

      " where num = ?";

    try {

   

    System.out.println(addressDTO.getBirthdate());

   

    conn = session.connect();

    pstmt = conn.prepareStatement(sql);

    pstmt.setString(1, addressDTO.getName());

    pstmt.setString(2, addressDTO.getAddress());

    pstmt.setDate(3, addressDTO.getBirthdate());

    pstmt.setInt(4,  addressDTO.getNum());

   

    result = pstmt.executeUpdate();

   

   

    }catch(Exception ex) {

    System.out.println("오류 발생: " + ex);

    }

    finally {

    session.close(conn, pstmt);

    }

   

    return result;

   

    }


    public int insertAddress(AddressDto addressDTO) {

   

    Connection conn = null;

    PreparedStatement pstmt = null;

    int result = -1;

   

    String sql = "insert into addressbook (NAME, ADDRESS, BIRTHDATE) " + 

      " values(?,?,?)";

    try {

   

    System.out.println(addressDTO.getBirthdate());

   

    conn = session.connect();

    pstmt = conn.prepareStatement(sql);

    pstmt.setString(1, addressDTO.getName());

    pstmt.setString(2, addressDTO.getAddress());

    pstmt.setDate(3, addressDTO.getBirthdate());

   

    result = pstmt.executeUpdate();

   

   

    }catch(Exception ex) {

    System.out.println("오류 발생: " + ex);

    }

    finally {

    session.close(conn, pstmt);

    }

   

    return result;

    }

    

    public int deleteAddress(Integer num) {

   

    Connection conn = null;

    PreparedStatement pstmt = null;

    int result = -1;

   

    String sql = "delete from addressbook " + 

      " where num = ?";

    try {

   

    conn = session.connect();

    pstmt = conn.prepareStatement(sql);

    pstmt.setInt(1, num);

   

    result = pstmt.executeUpdate();

   

   

    }catch(Exception ex) {

    System.out.println("오류 발생: " + ex);

    }

    finally {

    session.close(conn, pstmt);

    }

   

    return result;

    }


    

}



* 파일명: AddressDao.java


비고: 


[첨부(Attachments)]

AddressDao.zip





6. 서블릿 뷰 - [소스코드]


web.xml을 살짝만 수정해주면 된다. 크게 많이 수정할 필요가 없다.

이유는 자동생성되기 때문이다.


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


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1">

  <display-name>Archetype Created Web Application</display-name>

  

  

<!-- Subject: web.xml     -->

<!-- Filename: web.xml     -->

<!-- Created Date: 2020-09-19     -->

<!-- * Description:     --> 

<!-- 1. Maven 기반의 Servlet 실험(2020-09-20) --> 

  

  <welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

  </welcome-file-list>

  <!-- Board Servlet 자동생성됨 -->

  <servlet>

  <servlet-name>BoardListServlet</servlet-name>

  <servlet-class>mavenWeb.view.BoardListServlet</servlet-class>

  </servlet>

  <servlet>

  <servlet-name>BoardInsertServlet</servlet-name>

  <servlet-class>mavenWeb.view.BoardInsertServlet</servlet-class>

  </servlet>

  <servlet>

  <servlet-name>BoardDeleteServlet</servlet-name>

  <servlet-class>mavenWeb.view.BoardDeleteServlet</servlet-class>

  </servlet>

  <servlet>

  <servlet-name>BoardUpdateServlet</servlet-name>

  <servlet-class>mavenWeb.view.BoardUpdateServlet</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>BoardListServlet</servlet-name>

  <url-pattern>/board/list.do</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

  <servlet-name>BoardInsertServlet</servlet-name>

  <url-pattern>/board/insert.do</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

  <servlet-name>BoardDeleteServlet</servlet-name>

  <url-pattern>/board/delete.do</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

  <servlet-name>BoardUpdateServlet</servlet-name>

  <url-pattern>/board/update.do</url-pattern>

  </servlet-mapping>


</web-app>


* 파일명: web.xml


[첨부(Attachments)]

web.zip


package mavenWeb.view;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import mavenWeb.db.AddressDto;

import mavenWeb.db.AddressImpl;


/**

 * Servlet implementation class BoardDeleteServlet

 */

public class BoardDeleteServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public BoardDeleteServlet() {

        super();

    }


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


res.setContentType("text/html;charset=UTF-8");

PrintWriter out = res.getWriter();

out.print("<br/>");

AddressImpl address = new AddressImpl();

int result = address.deleteAddress(5);

AddressDto addressDto = address.getAddress(3);

out.println("<html><head><title>CRUD - Delete(Maven)</title></head>");

out.println("<body><h2>MyBatis - Delete(Maven)</h2>");

out.print("<br/>");

out.print("삭제여부:" + result + "</br>");

out.print("<br/>");

if ( addressDto != null ) {

out.print(addressDto.getNum() + "/" + addressDto.getName() + "/");

out.print(addressDto.getAddress() + "/" + addressDto.getBirthdate());

}

out.println("</body></html>");

out.close();

}


/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doGet(req, res);

}


}



* 파일명: BoardDeleteServlet.java


[첨부(Attachments)]

BoardDeleteServlet.zip


package mavenWeb.view;


import java.io.IOException;

import java.io.PrintWriter;

import java.sql.Date;

import java.text.SimpleDateFormat;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import mavenWeb.db.AddressDto;

import mavenWeb.db.AddressImpl;


/**

 * Servlet implementation class BoardInsertServlet

 */

public class BoardInsertServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public BoardInsertServlet() {

        super();

    }


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

res.setContentType("text/html;charset=UTF-8");

PrintWriter out = res.getWriter();

out.print("<br/>");

AddressImpl address = new AddressImpl();

AddressDto dbNode = new AddressDto(); 

dbNode.setName("도도" + serialVersionUID);

dbNode.setAddress("행복시 행복동");

// 버그1: new Date() 사용안됨. (2020을 3920으로 인식함.) 

// 버그2: new Timestamp() 사용안됨. (2020을 3920으로 인식함.) 

String userDate = "2020-02-01";

java.sql.Date sqlDate = java.sql.Date.valueOf(userDate);

dbNode.setBirthdate(sqlDate);

int result = address.insertAddress(dbNode);

AddressDto addressDto = address.getAddress(1);

out.println("<html><head><title>CRUD - Insert(Maven)</title></head>");

out.println("<body><h2>MyBatis - Insert</h2>");


SimpleDateFormat format1 = new SimpleDateFormat ( "yyyy-MM-dd" );

String birthdate = format1.format(addressDto.getBirthdate());

out.print("<br/>");

out.print("등록여부:" + result + "</br>");

out.print("<br/>");

out.print(addressDto.getNum() + "/" + addressDto.getName() + "/");

out.print(addressDto.getAddress() + "/" + birthdate);

out.println("</body></html>");

out.close();

}


/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

}


}



* 파일명: BoardInsertServlet.java


[첨부(Attachments)]

BoardInsertServlet.zip


package mavenWeb.view;


import java.io.IOException;

import java.io.PrintWriter;

import java.text.SimpleDateFormat;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import mavenWeb.db.AddressDto;

import mavenWeb.db.AddressImpl;


/**

 * Servlet implementation class BoardListServlet

 */

public class BoardListServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public BoardListServlet() {

        super();

    }


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

res.setContentType("text/html;charset=UTF-8");

PrintWriter out = res.getWriter();

out.print("<br/>");

AddressImpl address = new AddressImpl();

AddressDto addressDto = address.getAddress(16);

out.println("<html><head><title>CRUD - List(Maven)</title></head>");

out.println("<body><h2>MyBatis - List</h2>");

SimpleDateFormat format1 = new SimpleDateFormat ( "yyyy-MM-dd" );

String birthdate = format1.format(addressDto.getBirthdate());

out.print(addressDto.getNum() + "/" + addressDto.getName() + "/");

out.print(addressDto.getAddress() + "/" + birthdate);

out.print("<br/>");

out.println("</body></html>");

out.close();

}


/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doGet(req, res);

}


}



* 파일명: BoardListServlet.java


[첨부(Attachments)]

BoardListServlet.zip


package mavenWeb.view;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import mavenWeb.db.AddressDto;

import mavenWeb.db.AddressImpl;


/**

 * Servlet implementation class BoardUpdateServlet

 */

public class BoardUpdateServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public BoardUpdateServlet() {

        super();

    }


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


res.setContentType("text/html;charset=UTF-8");

PrintWriter out = res.getWriter();

out.print("<br/>");

AddressImpl address = new AddressImpl();

AddressDto dbNode = new AddressDto();

dbNode.setNum(3);

dbNode.setName("도도수정" + serialVersionUID);

dbNode.setAddress("행복시 행복동");


// 버그1: new Date() 사용안됨. (2020을 3920으로 인식함.) 

// 버그2: new Timestamp() 사용안됨. (2020을 3920으로 인식함.)

String userDate = "2020-07-01";

java.sql.Date sqlDate = java.sql.Date.valueOf(userDate);

dbNode.setBirthdate(sqlDate);

int result = address.updateAddress(dbNode);

AddressDto addressDto = address.getAddress(3);

out.println("<html><head><title>CRUD - Update(Maven)</title></head>");

out.println("<body><h2>MyBatis - Update(Maven)</h2>");

out.print("<br/>");

out.print("수정여부:" + result + "</br>");

out.print("<br/>");

out.print(addressDto.getNum() + "/" + addressDto.getName() + "/");

out.print(addressDto.getAddress() + "/" + addressDto.getBirthdate());

out.println("</body></html>");

out.close();

}


/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doGet(req, res);

}


}



* 파일명: BoardUpdateServlet.java


[첨부(Attachments)]

BoardUpdateServlet.zip




7. 데이터베이스 설계


예제 데이터베이스를 설계하도록 하겠다. 역설계에 대해서도 생각해보면, 흥미로운 주제가 될 것으로 보인다.


tableName(테이블명): addressbook


 키

 항목명

 속성 

 PK(기본키)

num

인덱스(ID)

 

name

nvarchar

 

address

nvarchar

 

birthdate

date




그림 16) 데이터베이스 테이블 - 설계



8. 결론(Conclusion)


순정 Maven MVC의 사용방법은 JSP/Servlet하고 동일하거나 큰 차이가 없다는 점을 알 수 있었다.

Spring-Framework의 Maven을 사용할 때 기본 원리를 이해하는 데 도움될 수 있을 거 같다.


* 소스코드: 동작 태스트 완료하였음.


Maven을 사용하면, 편해지는 부분이 정말 많아진다.



* 참고자료(Reference)


1. 자바 오라클 연동 데이터 삽입,수정,조회,삭제-1, https://ngg3319.tistory.com/76, Accessed by 2020-09-20, Last Modified 2018-03-12 16:17

2. 자바 오라클 연동 데이터 삽입,수정,조회,삭제-2, https://ngg3319.tistory.com/79, Accessed by 2020-09-20, Last Modified 2018-03-13 22:02

-> 추천(40점): 의외로 쉽게 잘 작성되어 있음.

-> 참고 부분: sqlDate 에 대해서 처리하는 방법 참고함. (String 문자로 java.sql.Date.valueOf()의 아이디어를 얻었음.)


3. maven 이용 spring MVC project 생성 :: Copy Coding, https://copycoding.tistory.com/178, Accessed by 2020-09-20, Last Modified 2019-05-03 12:27

-> 추천(70점): 순수한 Maven 프로젝트에 대해서 잘 설명되어 있음.


반응형
728x90
300x250

[Spring-Framework] 4. Eclipse와 Maven MVC 웹 프로젝트 - 생성하기


이번에 소개할 글은 Apache Maven 프로젝트(이하 "메이븐" 또는 "Maven")을 활용하여 Maven 기반의 MVC 프로젝트를 생성하도록 하겠다.

Spring-Framework를 이해하기 전에 경험해보면 도움이 될 것이라고 생각한다.


적용 대상: Eclipse 최신 버전(또는 Spring Tool Suite-4 이상)




1. 프로젝트 생성하기


프로젝트 생성부터 간단하면서도 알기 쉽게 작성하였다.



그림 1. Project 생성하기


File에서 New->Project...을 클릭한다.




그림 2. Project 생성하기


Use Default Workspace location을 체크한 후 Next를 누른다.



그림 3. Project 생성하기


org.apache.maven.archietypes    |   maven-archietype-webapp   |   1.4


해당 카탈로그를 선택한 후 Next를 누른다.



그림 4. Project 생성하기


아래 그림 3처럼 여러가지 값을 적는 창이 나타난다.

Group Id는 프로젝트를 진행하는 회사나 팀의 도메인 이름을 거꾸로 적는다.

Artifact Id는 해당 프로젝트의 이름을 적는다.

package는 위 두가지가 조합된 이름으로 나온다.


작성을 완료하였으면, Finish를 누른다.



그림 5. Project 생성하기


프로젝트 생성이 된 것을 확인할 수 있다.

Problems 창에 보면, Servlet 오류가 있는 것을 확인할 수 있다.

정상적으로 프로젝트가 생성된 것이다.



2. Maven 프로젝트에서의 Servlet-api.jar 파일에 대한 것(pom.xml 이해)


maven을 사용하면, 귀찮게 servlet-api.jar 파일을 따로 복사, 붙여넣기를 할 필요가 없다.



그림 6. 이전 스타일 - Maven 프로젝트를 사용하지 않은 경우


Apache Maven 프로젝트는 POM.xml 기반으로 동작한다.

따로 servlet-api.jar를 이전의 "WebContents\Web-inf\lib에 복사, 붙여넣기"를 안 해도 된다.




3. Maven 프로젝트에서의 Servlet-api.jar 파일에 대한 것(pom.xml 구현)


pom.xml 파일을 편집하여 servlet-api.jar를 자동으로 생성하는 방법에 대해서 소개하겠다.



그림 7. pom.xml - eclipse


pom.xml을 더블클릭한다.


<dependencies>~</dependencies> 내에는 <dependency>가 정의되어 있는 것을 살펴볼 수 있다.
(글로만 보면, 조금 어려우니 그림을 가지고 소개함.)


    <dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

<scope>provided</scope>

</dependency>


</dependency> 뒤에 위의 내용을 입력해준다.



그림 8. pom.xml - eclipse


pom.xml에 명령어를 입력함으로서 잠시 기다리면, javax-servlet-api-3.1.0.jar 파일이 자동으로 생성되는 것을 확인할 수 있다.

그리고 Problems 내에 발생했던 javax.servlet Error도 함께 사라지는 것을 확인할 수 있다.


참고: SSD 이상의 빠른 저장매체로 작업한다면, 빠르게 변화하는 모습을 확인할 수 있음.





4. Maven 프로젝트 - Hello World 실행하기


Maven 프로젝트를 Apache Tomcat 9으로 실행하도록 하겠다.



그림 9. Apache Tomcat 9으로 개발환경에서 모의 태스트 하기


"Run As..."를 누른다.




그림 10. Apache Tomcat 9으로 개발환경에서 모의 태스트 하기


Run on Server를 선택한 후 OK를 누른다.



그림 11. Apache Tomcat 9으로 개발환경에서 모의 태스트 하기


Tomcat 서버 셋팅을 한 후 Finish를 누른다.


비고: 이미 환경 셋팅이 된 모습이다. Tomcat v9.0 Server at localhost가 안 보인다면 환경설정을 따로 해야 한다.




그림 12. Apache Tomcat 9으로 개발환경에서 모의 태스트 하기


Finish를 누른다.



그림 13. Apache Tomcat 9으로 개발환경에서 모의 태스트 하기


Maven 기반으로 완성된 홈페이지를 살펴볼 수 있다.




5. Maven Project의 pom.xml 설정이 만능인가?


앞서 servlet-api.jar에 대해서 간단한 설정으로 자동생성이 된다고 소개하였다.

pom.xml 설정으로 모든 것을 다 처리할 수 있을 정도인지 언급해보려고 한다.


결론은 아니다.



그림 14. pom.xml 설정에서의 오류


pom.xml 설정을 하였는데, 운이 안 좋으면 jar파일을 못 찾을 수도 있다.

물론 36줄~40줄의 내용이 완벽한 것은 절대 아니다.


이 부분에 대해서는 추가적으로 소개하겠다.




6. Maven Project의 pom.xml 설정에 대한 정보찾기 


그림 14에서의 잘못된 pom.xml 설정의 문제에 대해서 잠깐 소개하였다.

구체적으로 Maven Project에서 지원하는 Repository가 무엇인지, 버전은 어떻게 되는지 각종 정보에 대해서 알 수 있는 사이트를 소개하겠다.


https://mvnrepository.com/


이 사이트를 모르면, 초기에 환경설정 작업을 하는 데 많이 힘들 것으로 보인다.



그림 15. mvnpepository.com (2020-09-19)


그림 15 사이트에 접속해서 검색해서 사용하고자 하는 버전, pom에서 지원하는지 등을 쉽게 살펴볼 수 있다.



그림 16. mvnrepository.com의 mysql 검색 결과 (2020-09-19)


MySQL Connector/J를 클릭한다.



그림 17. mvnrepository.com의 mysql 세부 결과 (2020-09-19)


세부적으로 지원하는 버전에 대해서 소개하고 있다.



그림 18. 버전을 클릭하여 pom에서 사용하는 코드 생성


Maven에 적용할 수 있는 코드가 출력되는 것을 확인할 수 있다.

그림 14의 오류 문제가 해결되는지 한번 적용해보겠다.



그림 19. 이상없이 적용된 mysql-connecotr-java-8.xx버전 - Maven MVC


<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>8.0.21</version>

</dependency>


정상적으로 동작하는 모습을 살펴볼 수 있다.



비고: MyBatis부터 다양한 Library를 예를 들면, 간단한 명령어로 연결시킬 수가 있음.




7. 결론(Conclusion)


pom.xml을 제대로 적용해주면, 많은 문제를 쉽고 간단하게 해결할 수 있다고 본다.

Maven MVC 웹 프로젝트 입문에 대해서 소개하였다.


JSP/Servlet을 경험한 사용자들을 위한 글을 한번 추가로 연재해보겠다.



* 참고 자료(References)


1. Maven Repository: mysql » mysql-connector-java » 8.0.21, https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.21, Accessed by 2020-09-20, Last Modified 2020-07-12.

2. Spring MVC Example for User Registration and Login - DZone Web Dev, https://dzone.com/articles/spring-mvc-example-for-user-registration-and-login-1, Accessed by 2020-09-20, Last Modified 2017-03-05.

3. Maven Repository: Search/Browse/Explore, https://mvnrepository.com/ , Accessed by 2020-09-20, Last Modified 2020-09-20.

반응형
728x90
300x250

[Spring-Framework] 3. Eclipse와 Apache Maven 프로젝트 - 구축하기(1)


Spring-Framework의 배경이 되는 Maven(이하 "Apache Maven") 프로젝트에 대해서 소개하려고 한다.


비고: 최신 Eclipse 개발도구에는 Maven Project가 내장되어 있음.


수동으로 콘솔 환경 등의 명령어로 Maven 개발환경을 구축하는 방법부터 시작해서 Eclipse 내장기능으로 사용하는 방법에 대해서 소개하겠다.



[Maven 개발방법]

1. 콘솔 등으로 수작업 개발 및 코딩
   (1, 2항목을 잘 읽어보면 도움이 될 것으로 보인다.)

2. Eclipse IDE 등을 활용한 Maven 개발환경 구축





1. Apache Maven Project


Apache Maven Project 사이트에 들어가면, Maven 프로젝트에 대해서 소개 및 자세한 내용을 살펴볼 수가 있다.


아파치 메이븐?

Apache Maven은 소프트웨어 프로젝트 관리 및 이해 도구이다.
프로젝트 개체 모델 (POM)의 개념을 기반으로 Maven은 중앙 정보에서 프로젝트의 빌드,보고 및 문서를 관리 할 수 있다.


URL: https://maven.apache.org/



그림 1. Apache Maven Project



그림 2. Apache Maven - Download


그림 2의 사이트에서 apache-maven-3.6.3.bin.zip을 내려받아서 수동으로 설치할 수 있다.





2. Maven 개발환경 - 설치하기


내려받은 apache-maven-3.6.3-bin을 압축푼다.



그림 3. apache-maven-3.6.3-bin 압축 풀기


apache-maven-3.6.3-bin.zip을 압축 푼다.

그러면, 폴더 하나가 생성되는 것을 확인할 수 있다.



그림 4. apache-maven-3.6.3


경로를 메모해둔다.

-> D:\apache-maven-3.6.3-bin\apache-maven-3.6.3





3. Maven 개발환경 - 시스템 환경설정


방금 전에 압축 푼 폴더를 바탕으로 Maven 개발환경을 셋팅할 것이다.



그림 5. apache-maven-3.6.3 - 시스템 환경 변수(N)


"시스템 -> 오른쪽 버튼 -> 속성"을 누른다.

"고급 시스템 설정 -> 고급 탭 -> 환경 변수(N)"을 클릭한다.



그림 6. apache-maven-3.6.3 - 시스템 환경 변수(N)


시스템 변수(S)에서 "Path" 변수를 찾아서 클릭한다.

"편집(I)"을 누른다.




그림 7. apache-maven-3.6.3 - 시스템 환경 변수(N)


맨 아래 항목에 아까 메모해둔 경로를 입력해준다. ("복사", "붙여넣기"를 권장함.)



4. Maven 개발환경 - 명령 프롬프트로 구축환경 확인하기


앞에 단계를 잘 했다면, 확인해야 할 것이다.

아래의 과정을 잘 따라하도록 하자.



그림 8. 명령 프롬프트 - 관리자 권한으로 실행하기


시작 메뉴에 cmd라고 입력 후 "관리자 권한으로 실행"을 클릭한다.



그림 9. 명령 프롬프트 - 관리자 권한으로 실행하기


mvn -version


이라고 명령어를 입력하면, 그림 9의 출력화면을 볼 수 있다.



5. Maven - Repository 경로 변경


기본 Maven Repository는 ${user.home}/.m2/repository 라는 폴더에서 관리한다.
dev 폴더에서 관리하도록 저장소를 로컬로 바꿀것이다.
dev 폴더에서 관리하길 원하지 않는다면, 이 단계는 넘어가도 된다.


[경로 변경 방법]

1. D:\.........중략......\apache-maven-3.6.2 에서 repository 폴더를 생성한다.

2. D:\.........중략......\apache-maven-3.6.2\conf 에서 settings.xml 파일을 연다. 

3. setting.xml 파일에서 <localRepository> 주석 처리된 부분을 찾은 뒤, 그 위에다 로컬 저장소를 등록한다.



그림 10. 폴더 만들기


임의의 폴더명 "repository"라는 폴더를 만들어본다.



그림 11. 환경설정 변경하기(1) - 변경 전


약 53줄에 있는 <localRepository>~</localRepository>를 복사해서 (빈 줄) 55줄 정도에 붙여넣는다.

[주석이 없는 빈줄에 넣어주기]



그림 12. 환경설정 변경하기(1) - 변경 후


입력을 완료하였다면, 저장을 누른다.





6. 응용 - Eclipse 프로젝트에 수동 설치한 Apache Maven 적용하기


최근 eclipse는 기본적으로 Apache Maven을 내장하고 있다.

하지만, 굳이 수동으로 설치한 Maven을 사용하고 싶다면, 다음처럼 사용할 수도 있다.



그림 13. Preferences 설정하기


"Window->Preferences"를 클릭한다.



그림 14. Preferences 셋팅하기


Maven 탭에서 Installations을 클릭한다.

그리고 "Add..." 버튼을 클릭한다.




그림 15. Preferences 셋팅하기


Directory 버튼을 누른다.



그림 16. Preferences 셋팅하기


apache-maven-3.6.3의 설치 경로를 선택한 후 "폴더 선택"을 누른다.




그림 17. Preferences 셋팅하기


설정을 확인한 후 "Finish"를 누른다.



그림 18. Preferences 셋팅하기


"apache-maven-3.6.3"을 체크한다.

그리고 "Apply"를 누르면 적용이 완료된다.



그림 19. Preferences 셋팅하기


사용자 환경설정에 관한 것이다.

Maven 탭에서 User Settings를 클릭한다.


[기본값]

User Settings: C:\Users\사용자계정명\.m2\settings.xml

Local Repository: C:\Users\사용자계정명\.m2\repository




그림 20. Preferences 셋팅하기


앞서 환경설정을 변경한 경로를 찾아서 선택한 후 "settings"를 열기한다.

(비고: Apache-maven-3.6.3\conf폴더 내에 settings.xml 파일이 존재함)



그림 21. Preferences 셋팅하기


그림 21처럼 변경한 후 "Apply"를 누르면 적용이 완료된다.



7. 맺음글(Conclusion)


Apache Maven 프로젝트를 설치하는 방법과 개발 환경 구축이라는 주제를 소개하였다.



* 참고 자료(Reference)


1. Maven - Welcome to Apache Maven, https://maven.apache.org/, Accessed by 2020-09-19, Last Modified 2020-09-10

반응형
728x90
300x250

[컴퓨터 - PC활용] 형상관리 - Eclipse SVN과 연동[클라이언트 사용](2)


형상관리 서버 구축이 되었다면, 클라이언트에서 사용하면 된다.

2번의 형상관리 SVN Server에 관한 글과 Eclipse 글을 반드시 따라한 후에 사용하는 것을 추천한다.


이 글을 읽기 전에 참고하면, 도움이 되는 글은 다음과 같다.


1. [컴퓨터 - PC활용] Eclipse에서 git 설치 및 push하기, https://yyman.tistory.com/1392, Accessed by 2020-09-19, Last Modified 2020-09-19 03:28

-> 비고: Eclipse에서 git 설치하기 (Help -> Install New Software 관련 부분 참고할 것)


2. [컴퓨터 - PC활용] 형상관리 - Visual SVN Server 서버 설치(1), https://yyman.tistory.com/1396, Accessed by 2020-09-19, Last Modified 2020-09-19 19:37

-> 서버 구축하기



*작업 프로그램:

[클라이언트]

* Eclipse IDE 통합 개발환경 프로그램(Spring tool-suite 4-4.7.2 포함)
* Subclipse 4.3 (Eclipse Marketplace)  -> 직접 영향

* git -> Install New Software에서 제공하는 것(다수)   -> 간접 참고(github 프로젝트에서 주로 사용함)
 
[서버]

* Apache Subversion 프로젝트

* Apahce Http Server 2.4


해당 글을 읽고 따라 하면 습득할 수 있는 것들 
1. svn에 프로젝트를 업로드 준비를 할 수 있다.

2. commit을 통해 svn 서버에 작업한 프로젝트를 업로드할 수 있다.

3. 협업 프로젝트 감각을 얻을 수 있다.
4. 소프트웨어공학론의 형상관리에 대해서 감각을 터득할 수 있을 거라고 주장한다.




1. Eclipse Subversion(Subclipse 4.3) 설치하기


이클립스에서 사용한 Subclipse를 설치하는 방법에 대해서 소개하겠다.



그림 1. Eclipse Marketplace - SVN


Help -> Eclipse Marketplace...을 클릭한다.



그림 2. Eclipse Marketplace - SVN


SVN을 검색한 후, Subclipse 4.3.0을 찾는다.

Install을 누른다.



그림 3. Eclipse Marketplace - SVN


잠시 기다린다.


그림 4. Eclipse Marketplace - SVN


Confirm을 누른다.



그림 5. Eclipse Marketplace - SVN


잠시 기다린다.



그림 6. Eclipse Marketplace - SVN


"I aceept the terms of the license agreement"를 체크한 후 Finish를 누른다.



그림 7. Eclipse Marketplace - SVN


기다린다.



그림 8. Eclipse Marketplace - SVN


인증받지 않은 소프트웨어에 대한 내용이다. 

Install anyway를 누른다.



그림 9. Eclipse Marketplace - SVN


재시작(Restart Now)을 누른다.



2. SVN-Server와 이클립스 연결하기


다음 소개할 내용은 이클립스에서 SVN-Server를 연결하는 방법에 대해 소개하겠다.




그림 10. SVN-연결하기


Window의 Perspective -> Open Perspective -> Other를 클릭한다.



그림 11. SVN-연결하기


SVN Repository Exploring를 클릭한다.



그림 12. SVN-연결하기


SVN이라는 아이콘을 클릭한다. (Add repositories라고 글자가 보임)



그림 13. SVN-연결하기


URI를 입력하라고 창이 뜬다.



그림 14. Copy URL to Clipboard - VisualSVN Server


VisualSVN Server에서 Repositories의 사용할 폴더를 선택한 후, 오른쪽 버튼을 누른다.

Copy URL to Clipboard를 클릭한다.



그림 15. Add SVN Repository


Url 주소를 입력 후 Finish를 누른다.



그림 16. Add SVN Repository


계정을 만들었을 때, 대문자, 소문자 조합으로 만들었으면 글자 그대로 입력해주어야 한다.

참고로 로그인 계정에서의 아이디의 대소문자를 구별한다.


OK를 누른다.



그림 17. SVN Repositories에 등록된 모습


https주소 생략/svn/Study의 폴더를 오른쪽 버튼 후 "새로고침(Refresh)"을 하게 되면, 계정을 입력해주라고 창이 뜬다.




그림 18. 계정 입력 모습


계정을 입력하면 SVN이 정상적으로 연결된 모습을 확인할 수 있다.

비어있으면 정상이다. 


이 부분은 trunked, branch 폴더가 있는 경우에는 VisualSVN Server Repository 폴더를 만들 당시에 "Single-project repository"로
선택한 경우에 보일 수도 있다.



그림 19. Create New Repository - Visual SVN Server






3. 이클립스에서 Team -> Share Project로 프로젝트 올리기(준비)


프로젝트 올리기에 관한 방법이다.



그림 20. Java 화면으로 전환


J 아이콘을 클릭하면, 프로젝트가 있는 "Java 화면"으로 전환할 수 있다.



그림 21. Team->Share Project


프로젝트에서 오른쪽 버튼을 클릭한다.

Team -> Share Project를 누른다.



그림 22. Share Project - Eclipse


Git과 SVN 두 가지 타입이 있다.

SVN을 클릭 후 Next를 누른다.



그림 23. Share Project


크게 변동할 것이 없다면, Next를 누른다.



그림 24. Share Project


현재 프로젝트명을 크대로 생성할 것이라고 가정하고 그대로 둔다. 

물론 "Use specified folder name" 항목에 입력해서 폴더명을 지정해줄 수도 있다.


그대로 두고 Finish를 누른다.



그림 25. Share Project


화면 전환에 관한 내용이다. Yes를 누른다. (Yes를 누르면 Synchronize 화면으로 전환됨)



그림 26. Share Project


전환된 화면을 확인할 수 있다.


참고로 "commit"을 하지 않았으니 업로드 된 것은 아니다. (준비 단계라고 보면 되겠다.)


그림 27. VisualSVN에서 확인하기




4. 이클립스에서 Team -> Share Project로 프로젝트 올리기(Commit - 업로드)


commit을 통해서 작업한 내용을 업로드하는 방법에 대해서 소개하겠다.



그림 28. commit하기 - Eclipse


프로젝트를 오른쪽 클릭한 후 Commit을 클릭한다.



그림 29. commit하기 - Eclipse


주석을 입력한 후 OK를 누르면 전송이 된다.



그림 30. commit하기 - Eclipse


전송이 완료되면, Synchronize 화면으로 자동전환되면서 History에는 초기 프로젝트가 생성되었다고 뜨는 것을 확인할 수 있다.



그림 31. commit하기 - Eclipse


SVN Repositories Explore아이콘을 클릭한다.

프로젝트를 오른쪽 버튼으로 클릭한 후 refresh를 클릭한다.

History 탭을 클릭하면, 개정에 대한 내용을 확인할 수 있다.


다른 개발자와 협업할 경우에는 프로젝트를 Check Out하여 내려받아서 사용하면 된다.




5. VisualSVN Server에서 Commit후 프로젝트 모습


프로젝트를 Commit하여 업로드하게 되면, VisualSVN Server에서도 확인할 수 있다.



그림 32. VisualSVN Server의 프로젝트 내용 확인하기




반응형
728x90
300x250

[컴퓨터 - PC활용] 형상관리 - Visual SVN Server 서버 설치(1)


SVN은 Apache 재단에서 만든 형상관리 프로젝트의 이름이고, 형상관리에 대한 정의부터 시작하여 서버 구축에 이르기까지 전반 과정을 소개하려고 한다.


소프트웨어 공학론 - "소프트웨어 구성 관리(이하 형상관리)"

* SCM(Software Configuration Management)


소프트웨어 형상관리는 Software Configuration Management, 줄여서 SCM라는 단어를 쓰기도 하는데, SW개발 및 유지보수 과정에서 발생하는 소스코드, 문서, 인터페이스 등 각종 결과물에 대해 형상을 만들고, 이들 형상에 대한 변경을 체계적으로 관리, 제어하기 위한 활동입니다.

단순히 말하자면 프로젝트를 진행하면서 생성하는 소스코드를 CVS나 SVN, 또는 GIT와 같은 버전 관리 시스템을 이용하는 것을 말합니다.

다수의 개발자가 프로젝트에서 동일한 기능을 동시에 개발한다고 할 때, 작성된 소스 코드와 변경사항을 확인하고, 수정하는 협업을 도와주는 시스템이라고 할 수 있습니다.


SCM이라는 용어는 경영학/산업공학에서도 사용되는 용어이다.


* SCM(Supply Chain Management) - 공급사슬관리


공급망 관리(供給網管理, supply chain management, SCM)란 부품 제공업자로부터 생산자, 배포자, 고객에 이르는 물류의 흐름을 하나의 가치사슬 관점에서 파악하고 필요한 정보가 원활히 흐르도록 지원하는 시스템을 말한다. 기업 내에 부문별 최적화나 개별 기업단위의 최적화에서 탈피하여 공급망의 구성요소들 간에 이루어지는 전체프로세스 최적화를 달성하고자 하는 경영혁신기법이다.


Visual SVN Server는 컴퓨터공학에서의 SCM에 관한 프로그램을 의미한다.



1. 형상관리를 하게 된 배경


형상관리를 다룰 일은 크게 개인 프로젝트에서는 적을 수도 있겠으나, 협업 프로젝트 등으로 갔을 때는 필수적인 부분이라고 본다.




그림 1. 형상관리가 필요한 이유


형상관리를 하게 되는 이유는 그림 1의 도식처럼 프로그램 개발에서 기록형태로 작업물을 효율적으로 관리하기 위해 생겨난 방법이라고 보면 된다.

물론 그림 1은 정확한 설명은 아니지만, 이해하는 개념으로 봤을 때는 도움될 수 있을 거라고 주장한다.


[첨부(Attachments)]

200919 - structure.pptx




2. 왜 버전 관리 시스템이 필요한가?


프로그램을 만들다 보면, 잘못 만들어서 다시 소스코드를 이전 상태로 되돌릴 필요도 있고, 변경된 이력을 확인할 필요가 있다.
그리고 여러 명의 개발자들이 동시에 같은 소스코드를 개발하면서 발생하는 충돌에 대한 처리도 필요하다.

그리하여 탄생하게 된 것이 버전관리 시스템이다. 즉, 형상관리에 관한 것이다.


과거와 달리 현재의 소프트웨어는 더 복잡해지고, 더 쉽게 변경된다.

만약 소프트웨어 버전관리 시스템을 사용하지 않는다면, 다른 개발자가 무엇을 했는지 알 길이 없으며, 실수를 쉽게 되돌릴 수도 없다.


형상관리를 하게 되면, 이러한 문제에 대해서 시간 형태로 다시 되돌릴 수도 있으며, 작업에 대해서 기록물로 체계적인 형태로 관리할 수 있다.



3. 용어


형상관리를 하게 되면, 알아두면 좋은 용어들이 있다.


중앙 저장소(Repository)

원본 소스를 저장하고 있는 저장소를 의미함.

작업 디렉토리(Working Copy)

원본 저장소로부터 체크아웃을 통해 내려 받은 내 로컬 PC에 있는
작업 사본 디렉토리를 의미함. 

커밋(Commit)

작업 디렉토리에서 변경, 추가 및 삭제된 파일을 원본 저장소인
서버에 적용하는 것을 말함.

갱신(Update)

체크아웃을 받은 작업 디렉토리를 원본 저장소의 가장 최신 커밋된 버전까지
 업데이트하는 명령어이다.

리비전(Revision)

소스 파일을 수정하여 커밋하게 되면 일정한 규칙에 의해 숫자가 증가한다.
저장소에 저장된 각각의 파일 버전이라 할 수 있다.

되돌리기(Roll Back)

작업 디렉토리에 저장되어 있는 사본을 특정 리비전 또는 특정 시간으로
복원할 수 있도록 하는 명령어이다.




4. Virtual SVN Server - 소개


아래의 링크를 들어가면, 내려받을 수 있다.

https://www.visualsvn.com/server/download/


버전: Community, Essential, Enterprise 3가지로 구성된다.
개인이나 소규모에게는 Community 버전도 충분할 것으로 보인다. (15명 사용자)


Virtual SVN Server는 Apache Subversion 1.10.6을 포함하고 있으니 참고하면 되겠다.

(Includes Apache Subversion 1.10.6)



그림 2. Visual SVN Server 4.2 (2020-09-19)



그림 3. Visual SVN Server License 정책 (2020-09-19)


이 글에서는 Visual SVN Server Community버전으로 설치하여 작업을 하는 방법에 대해서 소개하겠다.




5. Virtual SVN Server - 설치


설치 과정은 크게 다음과 같이 진행하면 된다. (설치는 크게 어렵지는 않음.)


포함된 구성요소:
* Apache HTTP Server 2.4.43

* Apache Subversion 1.10.6



그림 4. Visual SVN Server - Setup


Next를 누른다.



그림 5. Visual SVN Server - Setup


라이선스 정책을 읽어보길 바란다.

Next를 누른다.



그림 6. Visual SVN Server - Setup


Next를 누른다.

(크게 바꾸지 않아도 무방함.)



그림 7. Visual SVN Server - Setup


Next를 누른다.


참고로 웹 사이트는 Apache Web Server 2.4 기반으로 동작한다.



그림 8. Visual SVN Server - Setup


Next를 누른다.


참고: Active Directory 환경으로 가면, 윈도우 서버 등이 있어야 한다.
(공부 분야: 서버 운영관리 계열)




그림 9. Visual SVN Server - Setup


설치(Install)를 누른다.



그림 10. Visual SVN Server - Setup


잠시 기다린다.



그림 11. Visual SVN Server - Setup


Finish를 누르면 설치가 완료된다.




6. Visual SVN Server - 운영(Repository 생성)


Visual SVN Server를 처음 실행하면, 아래의 그림처럼 생긴 화면을 볼 수 있다.

크게 어렵게 생긴 프로그램은 아니다.



그림 12. Visual SVN Server 4.2.2




그림 13. Visual SVN Server 4.2.2


Repositories를 오른쪽 버튼을 누른 다음에, Create New Repository를 클릭한다.





그림 14. Visual SVN Server 4.2.2


Regular FSFS repository를 체크한 후 다음(N)을 누른다.




그림 15. Visual SVN Server 4.2.2


Repository Name(레포지토리 이름)을 입력한 후 다음(N)을 누른다.



그림 16. Visual SVN Server 4.2.2


"선호하는 초기 저장소 구조 선택(Select the preferred initial repository structure)"에 관한 것이다.

두 가지 옵션이 있는 데, Empty repository를 체크하고 다음(N)을 눌러도 무방하다.




그림 17. Visual SVN Server 4.2.2


새 저장소에 대해 원하는 종류의 권한을 설정하십시오.(Set the kind of permissions you want for the new repository)


All Subversions users have Read / Write access를 체크하고 Create를 누른다.



그림 18. Visual SVN Server 4.2.2


레포지토리가 생성된 것을 확인할 수 있다.

Finish를 누른다.





7. Visual SVN Server - 운영(사용자 계정 생성)


사용자 계정을 생성하는 방법이다.



그림 19. Create User - Visual SVN Server


Users의 폴더를 오른쪽 버튼 후 Create User를 누른다.



그림 20. Create User - Visual SVN Server


계정과 비밀번호를 입력한 후 OK를 누르면 된다.



그림 21. Create User - Visual SVN Server


사용자 계정이 생성된 것을 확인할 수 있다.



8. Community Version 내려받기


15 Users로 제한되는 커뮤니티 버전이다.


VisualSVN-Server-4.2.2-win32.zip

(Windows 32bit Version)


VisualSVN-Server-4.2.2-x64.zip

(Windows 64bit Version)




* 참고자료(Reference)


1. Visual SVN - Subversion-based version control for windows, https://www.visualsvn.com/, Accessed by 2020-09-19, Last Modified 2020-09-19

반응형

+ Recent posts