-
[패스트캠퍼스] 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)
쿠키와 세션까지 들었는데
적었던 내용이 임시저장이 안 돼서 날아갔다
다음주에 다시.. 들어야지... 😢
'패스트캠퍼스 > Java & Spring 웹 개발 종합반' 카테고리의 다른 글
[패스트캠퍼스] Java & Spring 웹 개발 종합반 8주차 학습일지 (0) 2023.04.02 [패스트캠퍼스] Java & Spring 웹 개발 종합반 7주차 학습일지 (0) 2023.03.26 [패스트캠퍼스] Java & Spring 웹 개발 종합반 5주차 학습일지 (0) 2023.03.10 [패스트캠퍼스] Java & Spring 웹 개발 종합반 4주차 학습일지 (1) 2023.03.05 [패스트캠퍼스] Java & Spring 웹 개발 종합반 3주차 학습일지 (1) 2023.02.26