[Java/Spring] MVC 2

나옹·2022년 11월 24일
0

MVC2

  • 지금까지 개발한 방식 - 동기방식 통신

  • 클라이언트 요청 서버의 처리(MVC 패턴)

  • 서블릿으로 컨트롤러를 정의했고 코딩

  • Model : DAO & DTO

  • View : html,css,js,jsp( 기본 문법, el표기법, jstl ) ~ jstl은 스프링에서 사용할 예정

    ex ) 회원 전체보기 기능을 구현하고 있다.
    클라이언트 요청 어떻게 할 것인가?

      컨트롤러 처리 어떻게 할 것인가?
       > 파라미터 받을 것인가?
       > 데이터베이스에서 자료를 가져와야 하는가?
       > 가져온 자료를 뷰에게 전달해야 하는가?
       > 전달하는 자료는 어떤 자료형인가? 원시타입, 객체, 리스트, map
    
      뷰에서는 어떻게 할 것인가? 클라이언트에게 제공할 화면을 정의를 하고 만든다.
       > 기본 html, css로 정적인 문서를 구현
       > 컨트롤러에게 받은 자료를 출력 ( el, jstl )
       > 클라이언트에게 js, jquery 등으로 동적인 문서를 제공한다.
                                 - ajax( 비동기 방식 통신 ) 

* 동기방식 vs 비동기방식

~ Tip ) 면접관이 ajax에 대한 질문을 한다면 동기와 비동기 방식 이해하고 있는지 보는 것 ~> 특징 포인트로 답하면 됨
서버 클라이언트 관계를 알고 있는지?

이해의 기준 : 클라이언트의 요청( 개발자가 정의 )
클라이언트가 동기방식으로 요청할 것인가? 비동기방식으로 요청을 할 것인가?
동기와 비동기는 웹에서만 사용되는 이론이 아니라 통신에 대한 이론이다.

동기방식 : 요청을 한다. > 요청을 기다린다. > 응답이 오면 이 때 작업을 한다. (응답이 오지 않으면 아무것도 하지 않고 기다림)

ex ) 번호표 뽑고 은행 업무 기다림 ( 이때, 직원은 한명 )
오지 않으면 아무것도 안하고 기다린다.
=> 특징 포인트 : 직렬적으로 순차적으로 처리한다.
정확한 결과를 예측할 수 있다.
장점 : 설계가 편하다. ~ 동시에 처리하지 않다.
단점 : 앞 작업의 결과가 있을 때까지 아무것도 못하고 대기하게 된다.

비동기방식 : 무조건 요청한다. > 응답을 기다리지도 않는다.

ex ) 햄버거가게 ( 직원 여러명이 동시 업무 처리 )
=> 요청하고 기다리지 않고 다른 작업을 한다, 응답이 안와도 상관없다.
=> 특징 포인트 : 병렬적으로 처리한다.( 동시에 처리한다는 의미 )
장점 : 자원의 낭비가 덜하다.( 동시에 업무를 여러개 시킨다. )
단점 : 설계가 동기보다는 복잡하다.

  • ex ) 게시글 등록에서 동기 vs 비동기 구분해보겠다.
    - 동기 방식 : 글을 모두 작성 후 서버에게 전송하고 등록되었다는 결과의 응답을 받아서 화면이 전체 리스트 보기로 바뀐다.(결과처리)
    ~ 만약, 서버에서 응답이 없다면 화면은 바뀌지 않는다.
    - 입력하면서 작성자가 등록된 작성자인지 서버와의 통신을 통해서 알아보는 기능을 동기방식으로 할 수 도 있고 비동기방식으로도 할 수 있다.
    만약, 동기방식이라면 글쓰기 동작의 순서가 등록된 작성자 확인이 끝나야만 글 등록이 가능하다.
    끝나면 화면 전체가 새로 고침이 된다.
    비동기방식으로 한다면 글 등록 여부와 상관없이 등록된 작성자 확인의 동작이 요청될 수 있다.
    즉, 서버와 통신하는 별도의 작업이 병렬적으로 생성이 되는 것이다.
    본 작업을 글쓰기이고, 병렬작업으로 등록된 작성자 기능이 설계됨.
    화면 전체가 새로고침을 하지 않고 html요소만 지정하여 변경할 수 있다.

  • Q ) 선생님 비동기방식으로 등록된 작성자 확인 기능이 있는데 실제로 이 기능을 먼저 하지 않으면 글 등록할 때 작성자 등록여부 확인하세요라고 경고창이 뜬다면
    이건 동기 방식이 아닐까요? ~ 캡쳐 화면 보기
    A ) 동기 방식이라면 작성자 등록 여부 확인 버튼 누르면 전체 화면이 하얗게 변한 다음 기존으로 돌아오는데 이 때, 원래 작업 (입력한 값들)이 사라졌을 수 있다.

안사라지기 위해서는 따로 코드 추가
작성자 등록 여부 확인 버튼 누르면 서버로 갔다 온다. + 글 등록버튼 누르면 서버로 갔다 온다.

비동기 방식이라면 기존의 화면을 유지한 상태로 등록 여부 확인을 하여 원래 작업 유지되어 있다.
서버에게 요청 작성자를 파라미터로 보낼테니 중복여부 확인해줘!
응답을 받아서 등록된 사용자라면 value=1로 바꾸는 코드를 해줘 ( 서버로 갔다 왔는지 확인만 하겠다. )

A 선생님 답안 ) 글 등록 시, 등록된 작성자 확인 기능이 동기방식으로 이루어지는 것이 아니라 등록 시, 작업이 이루어졌는지만 확인하는 절차가 있을 가능성이 높다.

의미1 : 등록여부확인 동기 방식으로 처리하고 글 등록을 동기방식처리
의미2 : 등록여부확인은 비동기 방식으로 처리해야 병렬적으로 처리해라
단, 글 등록 시 처리가 되었는지만 확인해라

  • 사용자가 사용할때는 같아 보이지만 내부적인 동작의 설계는 다르다.. 내부동작을 이해할 필요가 있다. 왜냐하면 비동기 방식이 아이중복체크, 등록여부확인에서만 사용되는 아니기 때문이다. 우리의 목적은 동기방식과 비동기방식의 이해가 우선이고, 이를 활용하는 설계적 측면이다.

비동기방식 구현 예)
인별그램 좋아요..
댓글.. 실시간 댓글 업그레이드..
글 전체보기에서 제목 옆에 댓글 수 보여주기..

** 화면의 로딩이 시간이 걸릴 경우는 동기보다는 비동기 나을 수 있다..
동기방식이라면 화면이 보여주는 순서가 같을 것이고 비동기라면 응답이 오는 순서대로 화면에 출력되니 매번 다를 수 있다.
개발을 프레임워크 기반에서 개발을 한다.. 운영은 프레임워크 합니다. 개발자은 기능을 정의를 해 줍니다.
예전경험을 본다면 고객관리프로그램을 만들면..>>
고객클래스정의, DAO, DTO, 기능별로 만들었습니다.>>> 매니저 클래스를 만들었다.
사용자가 100명이 동시에 사용한다.
프레임워크에서 매니저 클래스 역할을 해 주겠다.

개발의 주체가 개발자가 아니라 프레임워크 : loc Inversion of Control
DI - Dependency Injection(의존성 주입)
: 클래스에서 의존하는 객체가 있을 경우, 객체를 직접 만들지 않고 외부에서 객체의 주소를 주입받는 방식입니다.
: 스프링에서는 클래스의 의존관계를 별도의 설정파일에서 설정하고 관리합니다.
컨테이너: 스프링에서 설정된 것에 의해 객체가 만들어지면 이 객체를 컨테이너에서 보관하고 소스에서 필요하면 주입받아서 사용합니다.

class AAA{
BBB b // BBB객체가 필요
}

class BBB{
}
AAA클래스에서 b객체를 참조해야 한다. (AAA클래스는 BBB 클래스의 의존한다.
즉, AAA에 선언된 b라는 변수는 객체가 아닙니다. 참조변수입니다. 현제 이 참조변수는 객체의 주소가 없습니다. 즉 AAA객체는 BBB객체의의존하는데 실제 객체가 없습니다.
여기서 문제!!! b참조 변수가 객체의 주소를 저장하게 하는 방법은 3가지 정도가 있습니다. 생각해 보세요
3가지 방법에 대한 특징을 이해하면 DI를 이해할 수 있다.

** 필요하면 내가 만든다.
1. AAA라는 클래스가 직접 객체를 생성하는 방법 BBB b=new BBB()//BBB객체가 필요

** 필요하면 달라고 한다. (Spring -DI)
2. 다른 클래스에 BBB 객체를 만들고 생성자로 주소를 전달해 주는 경우
3. 다른 클래스에 BBB 객체를 만들고 setter로 주소를 전달해 주는 경우

  • 어노테이션 @ : 쉽게 말해서 택배 파손주의 스티커를 붙혀서 택배기사님에게 알려드리는 것과 비슷한 의미

    어노테이션은 소스를 컴파일하면 컴파일러에게 이런 역할을 하는 클래스다. 또는 기능을 요구한다고 알려주면 컴파일러는 어노테이션을 보고 해당 포지션에 배치시킨다 또는 원하는 기능을 해결해준다.
    ( @ 이것을 어노테이션이라고 함 , run as하는 과정이 컴파일해주는 것 )

스프링 이해 ex )
1. @WebServlet("/") 을 먼저 본다
2. HttpServlet을 본다
** 흐름순서 : 클라이언트 - 요청 -> 톰캣 -> 서블릿에서 처리
~ 서블릿을 하나의 프레임워크라고 봐도 됨

  • 컨트롤러가 어노테이션을 보고 컨트롤러인지 알고 객체를 알아서 만들어줌
  • 객체를 프레임워크가 관리한다. ~ 객체를 관리한다라는 개념 : 기존 개발자 > 프레임워크가 알아서 해줌
  1. 객체를 내가 만든다. 2. 컨트롤러로 동작할 수 있도록 만든다
  • 톰캣이 어떤 서비스를 요청하는지 알 수 있기 위해 컨트롤러가 필요함

  • IOC (제어의 역전?) : 프레임워크가 제어하는 것 ( 개발자가 직접 하는 것이 아니라 컨트롤러가 알아서 해주는 것)

  • 컨테이너라는 곳에 컨트롤러 넣어줌 ( 객체 만들어줌 ) - @WebServlet("/이름") ~ 이름 겹치면 안됨(mapping 이름 겹침 x) ~ 이름을 보고 객체 만들어줌

    왜 중복을 불허할까? 프레임 워크가 객체를 관리해서( 개발자가 객체 관리 X )

  • 서블릿 파일 만드는 것 자체가 프레임 워크 기능 빌려 쓰는 것

디렉토리가 어떤 역할을 하는지..

이곳에서 확장자를 jsp로 설정했기 때문에

여기의 home이 home.jsp 라는 것을 알 수 있다.

  1. 메이븐 디렉토리 구조 이해
  2. 설정파일 이해 web.xml >root-context.xml > servlet-context.xml
  3. MVC 설정 예.. 클라이언트에서 컨트롤러 처리(요청처리) 뷰 응답까지의 순서를 먼저 이해하시오
  4. 클라이언트에서 파라미터 보내고 컨트롤러에서 받는 법..
    가. 변수 하나 받기, 객체로 받기, json 받기
profile
최고의 개발을 위해 !

0개의 댓글