또자의 코딩교실

[스마트인재개발원]-1차 프로젝트를 진행하며-(4-0) 본문

코딩공부/프로젝트 진행

[스마트인재개발원]-1차 프로젝트를 진행하며-(4-0)

또자자 2021. 11. 22. 23:30

이번 포스팅에서는 프로젝트에 쓰인 MVC모델을 기반으로 한 전반적인 백엔드의 기반이 되는 개념부터 포스팅하려 한다. 

그리고 개념을 포함한 홈페이지와 DB를 연결하는 방법들과

Model, View, Controller에 있는 유기적인 관계들에 대해 포스팅 한 후,

첫화면과 회원가입 화면에 있는 코드들을 하나하나씩 뜯어보면서 분석하려한다

 

우선 MVC모델에 대해서 이해할 필요가 있다.

우선 간단하게 설명하자면,

기존 html은 css의 꾸미기 속성들을 더하여 visual studio에서 코드를 짜면 visual studio code에서 자체적으로 구동되는 서버가 html문서의 내용을 그대로 출력하는 형태였다면, 

 

MVC모델은 클라이언트가 요청한 서버의 경로(context path와 쿼리스트링 포함)에 따라서 서버가 해당하는 정보를 DB에 요청해 클라이언트에 되돌려주는 식으로 각 개체끼리 상호작용하며 작동되는 복합적인 양상을 띈다.

 

선생님께서 수업하시며 그려주신 대략적인 MVC-jdbc의 구동 구조.

우선, 쓰이는 용어들부터 간단하게 짚고 넘어가자.

프로젝트에서는 JDBC를 활용한 모델이 아닌 MyBatis를 사용하여 코딩하였다. 

MVC model의 구성

= JDBC or MyBatis(M) + JSP(V) + Servlet(C)


Client :
고객. 원하는 정보를 전송한다.

Server : 서버. 원하는 정보를 받아 DB에서 가져와 View에 맞는 형태로 다시 Client에게 전달해준다.
DataBase : 정보가 저장되어 있는 데이터들의 집합.


 

기초 개념 정리

 

  • TomCat : Tomcat Server이다. 도커역할을 한다. www.apache.org 에서 다운로드 받을 수 있다.
    • tomcat은 Java Servlet and JSP Container(웹 어플리케이션 구동 엔진서버)
      • +) 도커(Docker) : 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우르는 오픈소스프로그램으로 서버의 생성과 운영등을 도와주는 프로그램이다.
  • JDBC : java database connectivity. Java소스코드와 SQL을 합친 형태이며 수정이 어렵다는 단점이 있다. ojdbc6.jar를 추가해 라이브러리로 반드시 추가해야하며 동적로딩이 필요하다.
  • MyBatis : Java코드와 SQL을 분리한 Framework.
    • JDBC였다면 핸들러매핑에서 수행하는 모든 SQL query 명령문을
       MyBatis에서는 query문을 Mapper.xml파일로 분리해 따로 작성함으로써 서버 유지보수를 편리하게 도와주는 라이브러리이다.  
    • MyBatis의 필수 환경설정 파일
      1. configration file.xml(mybatis 기본 환경설정파일)
      DB연결을 어떻게 하고 mapper파일이 어디있는지 알려주는 역할
      API설정파일.

      2.DB properties file
      연결할 DB의 정보(driver, url, user, password)를 담음

      3.Mapper file
      Java가 실행시킬 수 있도록 SQLquery에 id와 result,parameter Type을 지정한 xml파일
  • LomBok : DTO(=VO)를 생성하고 나서 getter와 setter 생성자를 생략하게 해준다.
    (ex. @Data @AllArgsConstructor @NoArgsConstructor 삽입)생성자의 코드를 작성할 필요성을 줄여 코드의 간소화를 도와주는 라이브러리이다. 

  • Model : 실질적인 동작을 수행하는 Java Class 이다. Model의 구성요소로는 dto, dao, utility가 있다. 
  • Utility : 필요에 의해서 만든 util class
  • DAO : Data Access Object, DB와 연동되는 객체이다. (DB에 CRUD를 하는 객체) DB에 CRUD(Create,Read,Update,Delete)하는것을 담당한다. 

  • DTO(=VO) : Data Transfer Object, 데이터를 담아서 이동하는 객체.
    • Value Object라고도 하며, 이 구조가 한개의 value가 된다.(바구니 역할) 한 개의 덩어리를 value로 설정하는 식이다. (게시판 하나, 책 하나) DB table과 연결시켜야하므로 DB table과 동일한 구조로 만들수록 좋다.

    • 보통 덩어리들의 접근지정자는 정보은닉의 목적을 달성하기 위해 private를 통한 접근 불가의 상태이기 때문에 getter와 setter생성자를 만들어 접근을 가능하게 만든다. 

  • View : view에서 프레젠테이션 로직을 담당하고 응답이 전문이 된다. 서블릿이 응답하기 위해서는 MIMT(마임타입)와 빨대가 필요함 응답하기 전에 클라이언트에 마임타입(응답하려는 데이터의 형태)를 적어줌
  • Servlet : 자바클래스 형태의 웹 애플리케이션.
    • Java 내에 HTML 코드가 들어가는 구조이다.
    • 자바 소스코드를 작성하기 편안하지만 view에 어렵다.
    • Servlet이 되려면 HttpServlet의 상속을 받고 service method (JavaSE에서의 main method역할) 가 존재하며 Http서버의 요청과 응답을 처리할 수 있는 응답변수(req)와 매개변수(res) 2가지가 있으며 throws를 통해 에러에 대한 해결방법을 tomcat서버로 예외처리하는 4가지의 기본 요소가 필요하다.
  • JSP : Java Server Page의 줄임말으로 자바로 서버 페이지를 작성하기 위한 언어이다.
    • HTML 문서 내부에 자바 코드가 들어가는 구조(JSP 파일은 html 문서형태로 만들어지는데 head위에 <%@ page language="java" contentType="text/html; charset= 𝑒𝑛𝑐𝑜𝑑𝑖𝑛𝑔"𝑝𝑎𝑔𝑒𝐸𝑛𝑐𝑜𝑑𝑖𝑛𝑔=" {encoding}"%>
      (=지시자) 가 붙는 것이 차이점

  • Controller : FrontController에서 명령받은대로 해야할 동작들을 DAO에서 수행하게 한다.
    • 말하자면 FrontController의 명령을 하달받아 세부적인 일을 진행하는 하청업체. 
    • POJO : Plain Old Java Object. 일반적인 자바 객체.
      • 오래된 방식의 간단한 자바 오브젝트라는 말로서 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용되게 된 용어
      • 현 프로젝트에서는 프론트컨트롤러의 요청을 받아 실질적인 행동을 수행하는 하청업체의 느낌이다.  
    • 경로는 string의 형태이다. 경로를 굳이 서블릿으로 경로를 만드는것이 아닌 하청업체 pojo한테 다음페이지(forwarding할 url)을 받아서 넘겨주고 view의 경로를 만들어서 문자열로 리턴하게 지정하면 좋은 pojo라 할 수 있다.
  • FrontController : 클라이언트에게서 온 요청이 자기가 할수있는 N개의 .do중 어느것인지 판별한다. 판별 방법으로는 if-else문 혹은 핸들러매핑을 사용할 수 있다. 
    • HandlerMapping (핸들러매핑) = 요청이 어떤 룰으로 컨트롤러에게 보내는지(매핑하는지), 그 방법을 정해주는 클래스
  • HandlerMapping : 프론트컨트롤러가 HandlerMapping을 거쳐 키값을 보내주면 어떤 controller(리턴타입)가 동작하도록 return해주는 메소드.
    • HashMap을 사용하여 반응속도를 최대치로 끌어올린다. Spring에선 핸들러 매핑을 Dispatcher Servlet이라 한다.
    • req에선 뒤의 querystring을 읽을 수 있다. board들의 역할을 If-else문을 이용해 구분한다.
    • 형태에 따라 view값의 유무에 따라 분기점 지정
  • HashMap : 자료구조와 관련된 API중 key와 valuee 동시에 가진 자료구조 API이다.  빠른 검색, 탐색속도를 요구한다.
  • cpath(context-path) : context path는 클라이언트가 서버 내에서 웹 프로젝트를 찾아가는 경로이다.
    • view resolver에서 활용될 수 있다. view로 나온 경로를 : 을 기준으로 split하여 [0]번째가 아닌 [1]번째에 있는 /boardList.do를 가져올 수도 있다.
    • view를 split으로 나눈것의 [0]번째로 실질적인 Tomcat서버의 연결 주소를 일컫는다. 
  • View Resolver : controller에서 return값으로 View의 논리적인 이름을 넘기면 접두사와 접미사를 붙여주는 클래스.
    • View의 논리적인 이름은 HandlerMapping에서 View로 향하는 분기점을 구분하는 수단이 된다.
    • boardList >> /WEB-INF/board/boardList.jsp 로 접두사와 접미사를 붙여주는 클래스
  • setAttribute & getAttribute : 선택한 요소(element)의 속성(attribute) 값을 정한다.
    • List를 받기 위해서는 setAttribute()와 getAttribute()를 써야 한다. 
      이때 type이 Object 이기 때문에 반드시 형변환을 해줘야 한다.
  • HttpServletRequest/HttpServletResponse : 클라이언트에서 넘어온 요청 parameter (Servlet에서 전송해준다.) 와 응답 파라미터를 수집하는 코드. 
    • req객체를 이용하면 요청 url등을 받아 핸들러매핑에게 보내주면서 서버와 클라이언트를 연결시켜주는 결정적인 역할을 한다. 

  • (보충필요) 객체(data) 바인딩 : 객체를 특정메모리에 연결 시켜주는 기술
    • 사용자의 문자열 입력값을 어플리케이션 도메인 객체의 프로퍼티값으로 동적으로 할당해주는 것과 같은 일
  • 포워딩(Forwarding) : URL1에서 다음 이동할 URL2로 JSP(View)로 포워딩하는 변수(request, response)들을 넘겨주어 (forward) URL1 & URL2는 같은 객체를 공유한다.
    • 그렇기 때문에 사용자가 최초로 요청한 요청정보는 다음 url에서도 유효하다. 
    • 웹 브라우저에는 최초 호출한 URL만 표시되고, 이동한 페이지의 URL정보는 볼수 없다. 

  • Redirect : URL1에서 클라이언트에 작업을 처리할 URL2를 리턴한다. 그리고 클라이언트는 URL1과는 전혀 다른 새로운 요청을 생성해 URL2에게 다시 요청을 보낸다. 따라서 처음 보냈던 최초의 변수는 더이상 유효하지 않고 공유하지 않는다.
    • 새로운 페이지에서는 request, response 객체가 새롭게 생성된다.
    •  
      • 다른 web-container에 있는 주소로 이동이 가능하다. 웹 브라우저는 url을 지시된 주소로 바꾼다. 
  forward Redirect
URL의 변화 여부 X O
객체의 재사용 여부 O X
  • QueryString: Get방식에서 주로 쓰이는 패킷이 url중 ?뒤로 명시되어 넘어가는 형태.
    • 서버에 데이터를 전송하는 get과 post방식 중 post는 주로 form형태의 데이터들을 전송할 때 쓰이며 바디에 패킷을 담아서 패킷의 정보를 보호한다. 하지만 get방식(주로 기본값)은 넘어가는 방식이 전송하는 패킷이 클라이언트가 서버로 데이터를 보낼때 넘어가는 url에 패킷이 url의 ?이후로 querystring형태로 명시되게 된다. 하지만 get방식은 보안에 취약하고 많은 양의 데이터를 저장하기 어렵다. 

수업시간에 선생님이 설명해 주신 redirect에 관한 간단한 그림.&nbsp;


이상, 개념 정리 후 내가 이해한 MVC모델이 우리사이트에서 유기적으로 작동하는 순서는 다음과 같다. 

1. Client는 홈페이지에 접속해 제일 먼저 View(JSP)를 접하고 HTML/CSS 요소 중 name을 가지고 MainController에 지시를 내리는 버튼을 클릭한다.

1-1. Client는 클릭과 동시에 사이트에서 필요한 정보들이 담긴 객체(DTO)(VO)를 보낸다. 사이트 내에서 클라이언트의 정보는 서버가 사용가능한 자료형으로 짜여진 VO라는 옷을 입고 처리된다. 

2. 요청을 받은 MainController는 Client가 하달한 지시에 자신이 동작을 수행할 수 있는 하위 controller가 있는지 요청사항을 HandlerMapping을 통해 판별한다. 

3. HandlerMapping을 통해 판별되어 일할 하위 POJO(Controller)가 있다면 DAO객체가 생성된 controller에서 DAO 중 id가 동일한 DAO method를 실행하라 명령한다. 

3-1. DAO에서는 SQL Session을 연다. 그리고 세션은 해당하는 리턴타입에 따라 DataSet인 VO를 골라와 객체를 생성하기도 하고 int 타입의 필요한 데이터들을 반환한다. 대개 이 단계에서 오류가 많아 반드시 System.out.println 으로 불러와진 데이터들을 확인해야 한다. 

3-2. DAO 명령문 내에서 동일한 id를 가진 MyBatis로 분리한 SQL Query문이 실행되는 실질적인 Mapper.xml에 직접적인 SQL Query문을 실행하라 명령한다.

3-3. Mapper.xml에서는 DAO method에서 실행한 실질적인 작업을 수행한 후 커밋한 후 세션을 닫는다. 

4. DB에서 수행한 정보들의 결과를 JSP에서 객체 VO의 형태로 출력한다.

5. View는 담아온 결과들을 html/css의 형태로 다시 Client에게 전달한다.  

다음 포스팅에서는 실제 개발했던 프로젝트 사이트의 이동경로에 맞춘 Back-end Process를 유즈케이스와 화면설계서를 동반하여 설명하고자 한다.

Comments