ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [패스트캠퍼스] Java & Spring 웹 개발 종합반 6주차 학습일지
    패스트캠퍼스/Java & Spring 웹 개발 종합반 2023. 3. 19. 14:03

     

    내일배움카드, 국비지원교육


    Chapter 02. Spring MVC

    01. 원격 프로그램의 실행

    자바 인터프리터가 메인을 호출할 수 있는 이유는 main 메서드가 static이기 때문

     -> static이 아니면 객체를 생성해야 하는데, static이 없어도 실행되는 이유는 tomcat 내부에서 객체를 생성해주기 때문에

     

    외부에서 호출할 수 있도록 프로그램을 등록하고 URL과 프로그램을 연결해야 함

    @Controller				// 프로그램 등록
    public class Hello {
    
    	@RequestMapping("/hello")	// URL과 main()을 연결
        public void main() {
        	System.out.println("Hello");
        }
    }
    public class Main {
    	public static void main(String[] args) throws Exception {
    		//Hello hello = new Hello();
    		//hello.main(args);
            	// 위 소스는 private이기 때문에 호출이 불가능하다. 그렇다면?
    		// Reflection API를 사용 - 클래스 정보를 얻고 다룰 수 있는 강력한 기능제공
            
    		// 1. Hello 클래스의 Class 객체 (클래스의 정보를 담고 있는 객체)를 얻어옴
    		Class helloClass = Class.forName("com.fastcampus.ch2.Hello");
            
            	// 2. Class 객체가 가진 정보로 객체 생성
    		Hello hello = (Hello)helloClass.newInstance();
    		Method main = helloClass.getDeclaredMethod("main");
    		
    		main.setAccessible(true); // private인 main()을 호출 가능하게 함
    		main.invoke(hello); // hello.main()
    		
    		
    	}
    }

     

     

     

     

     

    02. AWS에 배포하기

    AWS에 배포해서 원격 컴퓨터로 확인해보기

    1. 프로젝트 export - war 파일 (war를 zip으로 변경해서 열어볼 수 있음)

    2. AWS 인스턴스 실행 후 원격 컴퓨터에 war 파일 복사 후 톰캣 실행

      C 드라이브 - tomcat - wepapps

    3. 원격 컴퓨터 프라이빗 IP:8080/ch2/hello로 접속

    4. 콘솔에 hello 잘 찍히는지 확인!

     

     

     

     

     

    03 ~ 04. HTTP 요청과 응답

    HttpServletRequest를 main 메서드의 매개변수로 넣으면 tomcat이 객체를 만들고 담아서 전달해줌

    https://github.com/castello/spring_basic/blob/main/ch2/RequestInfo.java

     

    HttpServletResponse로 브라우저에 나타내고 싶으면 아래의 코드가 필요함

    // main() 매개변수에 HttpServletResponse response
    response.setContentType("text/html");
    response.setCharacterEncoding("utf-8");
    PrintWriter out = response.getWriter();

     

     

     

     

     

     

    05. 클라이언트와 서버

    클라이언트 : 서비스를 요청하는 애플리케이션

    서버 : 서비스를 제공하는 애플리케이션

     

    Email Server(25), File Server(22), Web Server(80) 중 어떤 server에 대한 요청인지 구분하기 위해 포트 번호가 필요함

    포트 번호는 0 ~ 1023번까지 예약되어 있음

     

    웹 애플리케이션 서버(WAS) : 웹 애플리케이션을 서비스하는 서버

    서블릿(servlet) : 작은 서버 프로그램 (=Controller)

     

     

     

     

     

     

    06. 설정 파일 - server.xml, web.xml

    톰캣/conf/server.xml : Tomcat 서버 설정 파일

       -> 서비스, 커넥터, 엔진, 호스트 등

    톰캣/conf/web.xml : Tomcat의 모든 web app의 공통 설정

    웹앱/WEB-INF/web.xml : web app의 개별 설정

     

    원래 URL 연결을 web.xml로 하는 거였는데 어노테이션 형식으로 변경됨 ex) @RequestMapping

     

     

     

     

     

     

    07. HTTP 요청과 응답

    프로토콜 : 서로 간의 통신을 위한 약속, 규칙

    HTTP(Hyper Text Transfer Protocol) : 텍스트 기반의 프로토콜

      -> 단순하고 읽기 쉬움

      -> 상태를 유지하지 않음 (클라이언트 정보를 저장 X)

      -> 확장 가능 (커스텀 헤더 추가 가능)

    HTTP 응답 메시지
    상태코드 의미
    1xx Informational
    2xx Success
    3xx Redirect
    4xx Client Error
    5xx Server Error
    HTTP 요청 메시지
    GET 리소스를 가져오기 위한 것 (Read)
    쿼리 스트링으로 데이터를 보냄 (보안 취약)
    헤더만 있고 바디는 없음
    POST 서버에 전송할 데이터를 바디에 담고 있음
    보안에 유리(TLS), 데이터 공유에는 불리

     

    Postman 얘기하시길래 당연히 프로그램일 거라고 생각했는데

    크롬 확장 프로그램에도 Postman이 있구나.. 처음 알았다! 👀

     

     

     

     

     

     

    08. 텍스트와 바이너리, MIME, Base64

    바이너리 파일 : 문자와 숫자가 저장되어 있는 파일

    텍스트 파일 : 문자만 저장되어 있는 파일

     

    MIME(Multipurpose Internet Main Extensions)

     - 텍스트 기반 프로토콜에 바이너리 데이터 전송하기 위해 고안됨

     - HTTP의 Content-Type 헤더에 사용 (데이터 타입 명시)

     ex) text/html, text/css, text/javascript

     

    Base64 : 바이너리 데이터를 텍스트 데이터로 변환할 때 사용 (64진법)

     

     

     

     

     

     

     

    09. 관심사의 분리와 MVC패턴 - 이론

    SRP : 단일 책임의 원칙 (하나의 메서드는 하나의 책임만 져야 함)

     -> YoilTeller class에는 입력, 요일 계산, 출력 3가지가 존재하기 때문에 분리해야 함

     

    분리의 기준

     1. 관심사

     2. 변하는 것, 자주 변하지 않는 것 (common, uncommon)

     3. 공통 코드 (=중복 코드)

     

     

     

     

     

     

     

    11 ~ 12. 관심사의 분리와 MVC패턴 - 원리

    매개변수 이름은 중요하지 않기 때문에 arg로 가져옴 (MethodInfo.java 참고)

    매개변수 이름을 가져오려면 parameters 사용해야 함

    동그라미 부분을 체크해야 컴파일 할 때 매개변수 이름을 저장함

    자바 버전, 메이븐 버전, 업데이트 프로젝트까지!

     


    MethodCall2, 3 클래스에서 실행하면 값이 아니라 EL 형태로 그대로 나옴..💦

    내 코드는 값과 EL 사이에 띄어쓰기가 있어서 그런 거였다!

    수정 완~!


     

    위의 오류를 해결하려면 pom.xml 을 수정하거나 톰캣의 라이브러리를 import 해야 함

     

     

     

     

     

     

    13 ~ 16. 서블릿과 JSP

    서블릿과 JSP는 비슷함

    서블릿

    - @WebServlet = @Controller + @RequestMapping

    - 서블릿 인스턴스가 존재하지 않으면 init() -> service() 존재하면 service()

    - 종료되면 destroy()

    - lazy init

     

    JSP (Java Server Pages)

    - <% %> 메서드 영역

    - <%! %> 클래스 영역

    - 서블릿 인스턴스가 존재하지 않으면 jsp를 java(서블릿 소스 파일)로 변환 후 컴파일 후 인스턴스 생성(jspInit())

    - 서블릿 인스턴스가 존재하면 jspService()

    - 생성 없이 사용할 수 있는 객체가 있음(기본 객체) : request, response, session, application, out 등

     

    HTTP는 stateless이기 때문에 저장소가 필요함

    저장소 : 접근 범위와 생존 기간에 따라 4가지로 나뉨

    기본 객체 유효 범위 설명
    pageContext 1개 JSP 페이지 해당 JSP 내부에서만 접근 가능
    지역변수 저장, 기본객체
    EL을 쓰기 위해 필요함
    request 1+개 JSP 페이지 다른 JSP로 전달 가능(forward)
    요청마다 1개
    session n개 JSP 페이지 클라이언트마다 1개씩 존재하는 개별 저장소
    사용자 수만큼 만들어지기 때문에 서버 부담이 큼
    application context 전체 WebApp 전체에서 접근 가능한 하나의 공통 저장소
    속성 관련 메서드 설명
    setAttribute(String name, Object value) 지정된 값을 지정된 속성 이름으로 저장
    getAttribute(String name) 지정된 이름으로 저장된 속성의 값을 반환
    removeAttribute(String name) 지정된 이름의 속성을 삭제
    getAttributeNames() 기본 객체에 저장된 모든 속성의 이름을 반환

     

    @WebServlet으로 서블릿을 URL에 매핑

    종류 URL pattern
    exact mapping /login/hello.do
    path mapping /login/*
    extension mapping *.do
    default mapping /

    요청이 오면 DispatcherServlet이 다 받음

     

    EL (Expression Language) : <%=값 %> 을 간편하게 하기 위해 ${값 }

     

    JSTL (JSP Standard Tag Library) : <% ~ %>을 간편하게 하기 위해

    Filter : 공통적인 요청 전처리와 응답 후처리에 사용함 (로깅, 인코딩 등)

     

     

     

     

     

    17 ~ 18. @RequestParam과 @ModelAttribute

    @RequestParam : 요청의 파라미터를 연결할 매개변수에 붙이는 애너테이션

        name : 파라미터 이름, required : 필수 여부 (기본값 true)

        required가 false일 때는 defaultValue를 입력해줘야 함

        기본형, String이면 생략 가능

     

    @ModelAttribute : 적용 대상을 Model의 속성으로 자동 추가해주는 애너테이션

       반환 타입 또는 컨트롤러 메서드의 매개변수에 적용 가능

       타입이 참조형이면 생략 가능

     

    WebDataBinder : 브라우저를 통해서 요청받은 값이 실제 객체에 바인딩 될 때, 타입 변환과 데이터 검증을 한 결과(BindingResult)를 컨트롤러에 넘김

     

     

     

     

     

     

    20 ~ 21. @GetMapping, @PostMapping

    @RequestMapping에 Method 작성하는 것 대신, @GetMapping과 @PostMapping 사용 가능

    servlet-context.xml에 작성한 view-controller는 GET 방식만 허용함

    m.addAttribute("msg", msg);
    return "redirect:/register/add";
    // 위의 내용과 아래의 내용은 동일한 의미
    return "redirect:/register/add?msg="+msg;

    URL인코딩 : URL에 포함된 non-ASCII 문자를 문자 코드(16진수) 문자열로 변환 (URLEncoder, URLDecoder)

     

     

     

     

     

     

    22. redirect와 forward

    redirect : 다른 URL로 재요청하는 것, location대로 GET 요청을 보냄

    forward : 요청받은 내용을 다른 jsp로 전달해주는 것(request와 response를 함께 전달)

     

    - RedirectView

    요청 -> DispatcherServlet -> Controller에서 redirect가 리턴되면 RedirectView로 응답

     

    - JstlView

    요청 -> DispatcherServlet -> Controller에서 뷰 이름(registerForm) 반환 -> DispatcherServlet이  InternalResourceViewResolver에 전송하면, /WEB-INF/views/registerForm.jsp로 반환 -> DispatcherServlet이 JstlView로 보내면, 받아서 Model을 넘겨줌 -> registerForm.jsp 응답

    *InternalResourceViewResolver는 servlet-context.xml에 있음

     

    - InternalResourceView (forward 할 때 사용되는 View)

     

     

     

     

     

     

     

     

    쿠키와 세션까지 들었는데

    적었던 내용이 임시저장이 안 돼서 날아갔다

    다음주에 다시.. 들어야지... 😢

     

     

     

     

     

     


     

     

     

    댓글