자바 소스 코드의 실행 과정

    1. 소스 파일 작성
      • 일반적으로 IDE 를 통해 작성한다.
    2. 바이트 코드 생성
      • 작성한 소스 파일을 컴파일하면 JVM 이 이해할 수 있는 바이트 코드(.class)가 생성된다.
      • eclipse, IntelliJ 등의 IDE 를 통해 소스 파일을 작성하는 경우에는 작성한 소스 파일을 저장할 때 자동으로 컴파일하여 바이트 코드를 생성한다.
    3. 바이트 코드 실행
      • JVM 은 바이트 코드를 읽고 메모리에 저장한다.
    4. 프로그램 실행
      • JVM 은 바이트 코드를 컴퓨터가 이해할 수 있는 바이너리 코드로 컴파일하여 실행한다. 이 때, main() 메서드가 가장 먼저 실행된다.

'Java' 카테고리의 다른 글

애너테이션  (0) 2022.09.06
Thread의 동기화 처리  (0) 2022.09.04
Demon Thread  (0) 2022.09.04
Thread 의 동시성과 병렬성  (0) 2022.09.01
JVM - Java Virtual Machine  (0) 2022.08.30

스프링 MVC 구조와 동작 순서

출처 - 김영한님의 스프링 MVC 1편

  1. 핸들러 조회
    • 핸들러 매핑을 통해 요청 URL에 매칭되는 핸들러(컨트롤러)를 조회
    • @RequestMapping 으로 등록한 핸들러를 조회
  2. 핸들러 어댑터 조회
    • 핸들러를 실행할 수 있는 핸들러 어댑터를 조회
    • @Controller 로 등록한 빈 객체가 어댑터에 해당
  3. 핸들러 어댑터 실행
  4. 핸들러 호출
  5. ModelAndView 반환
  6. viewResolver 호출
  7. View 반환
    • viewResolver 에서는 ModelAndView 객체에 담겨있는 View 정보를 통해 해당 View를 찾아 반환한다.
  8. View 생성
    • 반환된 View에 ModelAndView 객체 안에 있는 Model 데이터를 적용하여 렌더링한다.
  9. HTML 응답
    • 생성된 HTML 문서를 반환한다.

 

DispatcherServlet

  • 스프링 MVC 에서 프론트 컨트롤러의 역할을 담당하는 서블릿
  • 기존의 하나의 URL 요청을 담당하던 Servlet 과는 달리 모든 요청을 받아서 처리하며 각각 다른 URL 요청에 따른 처리는 컨트롤러에 위임하여 처리한다.

'Spring > Spring MVC' 카테고리의 다른 글

MVC 패턴  (0) 2022.08.21
Servlet & Servlet Container  (0) 2022.08.03

MVC 패턴

  • 애플리케이션을 Model-View-Controller 로 구분하여 설계하는 디자인 패턴
  • 역할에 맞게 모듈을 분리함으로서 유지보수 및 확장이 용이하다.

 

MVC 패턴 사용 이전과 이후의 비교

MVC 패턴 사용 이전

@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        int age = Integer.parseInt(req.getParameter("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");

        PrintWriter writer = resp.getWriter();
        writer.write("<html>\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "</head>\n" +
                "<body>\n" +
                "성공\n" +
                "<ul>\n" +
                "    <li>id="+member.getId()+"</li>\n" +
                "    <li>username="+member.getUsername()+"</li>\n" +
                "    <li>age="+member.getAge()+"</li>\n" +
                "</ul>\n" +
                "<a href=\"/index.html\">메인</a>\n" +
                "</body>\n" +
                "</html>");
    }
}
  • 컨트롤러에서 조회한 데이터를 통해 View 를 만드를 로직까지 포함하고 있다. 하나의 모듈에서 여러 역할을 수행하게되면 그만큼 코드가 많아지고 코드를 변경해야할 때 변경 부분을 찾기가 힘들어지는 등 유지보수 및 관리가 힘들어진다.

 

MVC 패턴 사용 이후

/*
	비즈니스 로직을 실행하는 컨트롤러의 역할을 담당하는 서블릿
*/
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        int age = Integer.parseInt(req.getParameter("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        // Model에 데이터를 보관
        req.setAttribute("member", member);

        String viewPath = "/WEB-INF/view/save-result.jsp";
        RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);
        dispatcher.forward(req, resp);
    }
}


/*
	View 의 역할을 담당하는 JSP
*/
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
성공
<ul>
    <li>id=${member.id}</li>
    <li>username=${member.username}</li>
    <li>age=${member.age}</li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
  • MVC 패턴을 통해 컨트롤러와 View 의 로직을 분리하면 코드 변경시 변경 사항을 담당하는 모듈의 코드만 변경하면 된다. 즉, 변경 포인트가 명확해진다.

'Spring > Spring MVC' 카테고리의 다른 글

스프링 MVC 구조 & DispatcherServlet  (0) 2022.08.21
Servlet & Servlet Container  (0) 2022.08.03

네트워크 계층에서는 송신시에는 전송계층으로부터 전달받은 세그먼트에 IP 헤더를 추가하며 수신시에는 데이터링크 계층으로부터 전달받은 프레임으로부터 IP 헤더를 제거한다.

  • IP 주소를 설정하여 데이터가 송신지에서 최종 수신지까지 정확하게 전송되도록 경로를 설정하는 계층

 

IP 프로토콜

  • 컴퓨터 간에 통신하기 위해 인터넷 계층에서 사용하는 프로토콜
  • 데이터를 전송할 최적의 경로를 선택하는 라우팅 기능을 수행

'Network' 카테고리의 다른 글

TCP/IP - 전송 계층  (1) 2022.08.20
TCP/IP - 응용 계층  (0) 2022.08.20
TCP/IP 프로토콜  (0) 2022.08.13
OSI 참조 모델  (0) 2022.08.04
TCP 커넥션  (0) 2022.07.31

전송 계층

전송 계층에서는 송신시에는 응용 계층으로부터 전달 받은 데이터를 세그먼트로 분할하고 헤더에 순서를 표시한다. 수신시에는 헤더에 있는 순서를 통해 데이터를 재조립하여 응용 계층에 전달한다.

  • 송신자와 수신자를 연결하는 통신 서비스를 제공하는 계층
  • 오류 복구와 흐름 제어를 담당하고 데이터의 신뢰성을 보장
  • 데이터를 송신시에는 데이터를 세그먼트들로 나누는 단편화를, 수신시에는 데이터를 재조립하는 역할을 담당
  • 연결형 통신 프로토콜인 TCP 와 비연결 지향 프로토콜인 UDP 를 사용

 

TCP - Transmission Control Protocol

  • 전송 제어 프로토콜
  • 두 개의 호스트를 연결하고 신뢰성 있는 바이트 스트림 서비스를 제공
  • 클라이언트와 서버가 데이터를 전송하기 전에 먼저 데이터를 송수신할 수 있는 연결 통로를 만들고 데이터를 전송
    • 3-Way Handshake 를 통해 클라이언트와 서버는 TCP 커넥션을 맺고 데이터를 전송
    • 4-Way Handshake 를 통해 통신을 종료

 

다음글

 

'Network' 카테고리의 다른 글

TCP/IP - 인터넷 계층  (0) 2022.08.21
TCP/IP - 응용 계층  (0) 2022.08.20
TCP/IP 프로토콜  (0) 2022.08.13
OSI 참조 모델  (0) 2022.08.04
TCP 커넥션  (0) 2022.07.31

응용 계층

OSI 참조 모델을 기준으로 본 응용 계층의 구조

  • 클라이언트의 요청을 전송하기 위해 데이터를 서버가 이해할 수 메시지로 변환하고 하위 계층인 전송 계층으로 전송하는 역할을 담당하는 계층

 

OSI 참조 모델을 기준으로 본 응용 계층의 세부 계층

응용 계층

Message - 응용 계층에서의 데이터 단위

  • 파일 전송, 데이터베이스, 원격 접속, 메일 전송 등의 서비스를 제공. 해당 서비스들은 응용 프로그램을 통해 사용자에게 제공
    • HTTP - 서버와 클라이언트 간에 하이퍼텍스트 문서를 송수신하는 프로토콜
    • FTP - 인터넷에서 파일을 전송하는 기본 프로토콜
    • SMTP - 메일을 송수신하기 위해 사용되는 프로토콜

 

표현 계층

  • 송신 측과 수신 측의 데이터 표현의 차이를 해결하기 위해 서로 다른 형식으로 변환하거나 공통 형식을 제공하는 계층
  • 암호화 / 복호화, 압축 / 압축 해제, 코드 변환 등을 처리

 

세션 계층

  • 세션 연결의 설정과 종료, 세션 메시지 전송, 동기화 등을 담당하는 계층
    • 동기화 - 데이터를 전송할 순서와 수신자 확인이 필요한 곳을 결정

'Network' 카테고리의 다른 글

TCP/IP - 인터넷 계층  (0) 2022.08.21
TCP/IP - 전송 계층  (1) 2022.08.20
TCP/IP 프로토콜  (0) 2022.08.13
OSI 참조 모델  (0) 2022.08.04
TCP 커넥션  (0) 2022.07.31

+ Recent posts