Wed Jan 05 12:07:23 KST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
SSL(Secure Socket Layer) 서버 인증서 검증 http + s = https 의 s 를 의미한다. 보안 프로토콜을 통해 클라이언트(브라우저)와 서버(웹서버) 보안이 향상된 통신을 하는 것을 말한다. http + key(SSL) key는 클라이언트와 서버만 알수 있다. 따라서 스니퍼(Sniifer)가 발생하지 않는다. SSL은 80번 포트를 사용하는 http 달리 443번 포트를 사용하는 TCP 기반의 프로토콜이다. TCP(3웨이핸드쉐이크->전송->종료)
해결 SSL 관련 에러이다. SSL (서버 인증서 검증) 을 끄자. MySql이 5.5 버전부터 SSL 접속을 기본 세팅을 해놓았다. 따라서 SSL처리를 안 하면 위와 같은 에러 메시지를 보여준다.
Connectionless Protocol - 웹 서비스는 HTTP 프로토콜을 기반으로 하는데, HTTP 프로토콜은 클라이언트와 서버의 관계를 유지 하지 않는 특징이 있다. - Http 통신은 한 번 연결하고 나서 끝나면 끊어버린다. 그 이유는 클라이언트의 요청이 너무 많아 서버의 부하를 줄이기 위해서이다. 불편한점 : 이러한 Connectionless Protocol의 불편함을 해결하기 위해서 세션과 쿠키를 이용한다. 세션과 쿠키는 클라이언트와 서버의 연결 상태를 유지해주는 방법으로, 세션은 서버에서 연결정보를 관리하는 반면 쿠키는 클라이언트에서 연결정보를 관리하는데 차이가 있다.
차이점
서버에서 서버연결정보 관리
클라이언트에서 연결정보 관리
20-2 HttpAervletRequest를 이용한 세션 사용
설명
서버에 세션 정보가 있다.
HttpServletRequest 이용
20-3 HttpSession을 이용한 세션 사용
방법
설명
HttpSession 이용
HttpServletRequest와 차이점은 거의 없으며, 단지 세션객체를 얻는 방법에 차이가 있을 뿐이다. 단 바로 httpSession을 바로 받았으므로 getSession을 해줄 필요가 없다. (이게 더 편한 것 같다.)
20-4 세션 삭제 (Invalidate())
설명
로그아웃 또는 회원탈퇴 시 session.invalidate();를 통해 세션을 삭제 할 수 있다.
관련 코드
20-5 세션 주요 메서드 및 플로어
자주 쓰이는 메소드
- 세션에서 자주 쓰이는 메소드 1, 2, 3번 마지막
20-6 쿠키(Cookie)
쿠키를 생성하는 방법
설명
1) mallMain()에서 쿠키를 생성하고, 파라미터로 받은 HttpServletResponse에 쿠키를 담고 있다. 2) 쿠키를 생성할 때는 생성자에 두 개의 파라미터를 넣어주는데 첫 번째는 쿠키이름을 넣어 주고 두 번째는 쿠키값을 넣어준다.
@CookieValue 에노테이션 : value속성은 쿠키이름을 나타내며 만약 value에 명시한 쿠키가 없을 경우 exception이 발생한다 그런 것을 방지하고자 required 속성이 있다. Required 속성은 기본 true인데 true인 경우 value값에 해당하는 쿠키가 없으면 exception이 발생하고 false이면 exception이 발생하지 않는다.
실제 실무에선 세션을 사용한다.(보안에 쿠키에 비교적 좋음) 쿠키는 보통 중요정보가 아닐 때 사용한다.
*좌측 : Controller 우측: html 파일 - html의 <form action>에서 액션명과 메서드를 명시한다. - method 를 각각 get or porst로 맞춰준다. - 단, get은 defalut여서 기입안해도 get이다.(생략가능) - 써주는 것이 가독성은 좋다.
value속성
메서드를 연결해준다.
method속성
get방식인지 post방식인지 구분한다.
post방식 보안에 좋다. (아이디, 비밀번호 등)
18-3 요청 파라미터
컨트롤러의 URL 맵핑과 파라미터 처리 방법에 대해서 학습
19-1 @ModelAttribute
예제
설명
컨트롤러에서 사용한 객체(Member member)를 뷰단에서 그대로 사용가능하다. 특정한 이유를 (커멘더)객체의 이름을 변경할 때 @ModelAttribute를 사용한다.
@ModelAttribute 사용 예시 객체명 바꿔주는 기능
@ModelAttribute 사용 예시 메서드명을 바꿔주는 기능
19-2 커멘드 객체 프로퍼티 데이터 타입
단일 커맨드(기존방식)
중첩 커맨드
1. List<MemPhone>
1. MemPhone이라는 객체를 하나 더 생성한다. 2. html에서 중첩관련 데이터는 음영 처럼 input 태그를 여러개 단다.
19-3 Model & ModelAndView
Model & ModelAndView 비교
설명
기존 Model 뷰 사용 방법 1. model.addAtribute를 이용하여 모델에 값을 설정한다. 2. return memModdifyOK는 memModifyOk.jsp를 호출하는 것이다. 3. memBef, memAft는 뷰단에서 사용가능하다.
ModelAndView는 기존 Model이 데이터만 전달하는 것에 대비 데이터와 뷰의 이름을 함께 전달하는 객체이다. *setViewsName("뷰이름")
문제 설명 U: 위쪽으로 한 칸 가기 D: 아래쪽으로 한 칸 가기 R: 오른쪽으로 한 칸 가기 L: 왼쪽으로 한 칸 가기 위의 조건에 따라서 간선을 움직이며 총 방문 길이를 구하는 문제. 지하철역으로 따지면 지하철역을 방문했냐는 것을 묻는게 아닌 총 역에서 역을 간 횟수(길이)를 구하는 문제
해당 숫자들이 움직인 거리이며 만약 노드로 체크를 했다면 (0,1)좌표에 방문을 했다고 표시를 한다.
해당 8,9는 이미 왔던 곳이기 때문에 방문길이 플러스 하지 않는다.
조건 1. 방문 했던 노드 간선을 다시 간다면 방문 길이에 포함 되지 않는다. 2. x(-5.5) y(-5,5) 범위 내에서만 움직일 수 있다.
문제 풀이 당연히 실수로 각 노드를 visit배열로 처리해서 풀었음..ㅠ (리뷰를 보니 다 똑같이 실수를 했음) 1. 방문 간선을 체크한다.(4차원 배열로 처리) 2. 방문가능한 노드 검사 (x,y 좌표 -> 0미만 11초과 X) *-5->0으로 0,0가 맨왼쪽이라는 가정하에 풀었음) 따라서 시작점은 5,5
1. 클라이언트(브라우저)가 서버(WAS)에게 Request를 한다. 2.WAS에서 데이터베이스에게 Request를한다.(Service & DAO) 3. WAS는 UI작업을 해서 클라이언트에게 Response를 http로 준다.
단점
WAS쪽에 때려박다보니 유지보수 측면에서 너무 빡세다.
모델2 방식(MVC 방식) Spring도 그렇고 거의 대부분 이거다.
기본적인 설계 모델
흐름
위와 차이점 1. WAS들어 올때 Controller, Service, DAO를 거친다. 2. Service 모듈화 (기능) 3. DAO->모델->데이터베이스 4. Controller에게 줄때 JSP(view)를 거쳐서 Response해준다.
장점
유지보수 측면에서 좋다.
13-2 스프링 MVC프레임워크 설계구조
가장 중요한 부분이며 암기!!!
설계구조
흐름도
1, DispatcherServlet 이라는 객체가 요청을 클라이언트(브라우저)로 부터 받는다. 2. HandlerMapping에게 던진다. (HandlerMapping이란 녀석은 여러 수많은 컨트롤러에서 가장 적합한 컨트롤러를 매핑해준다) 3. HandlerAdapter 각 컨트롤러의 가장 적합한 메서드를 찾아내고 model를 받아온다. 중략... (Service->DB) 4. ViewResolver (뷰)한테 Model 보낸다. 가장 적합한 JSP를 선택한다. 5. View 응답생성(JSP)
가로챈 정보를 HandlerMapping에게 보내 요청을 처리할 수 있는 Controller를 찾아낸다. 디폴트 전략 : BeanNameUrlHandlerMapping, DefaultAnnotationHandlerMapping
요청을 찾은 컨트롤러에게 보낸다. (컨트롤러 → 개발자 구현 영역)
컨트롤러에서 해당 요청 처리 후 요청을 응답받을 View의 이름을 리턴. 이 이름을 ViewResolver가 먼저 받아 해당하는 View가 있는지 검색
해당 View가 존재한다면 처리결과를 View에 보낸 후 결과를 다시 DispatcherServlet에게 전달. DispatcherServlet은 최종 결과를 클라이언트에게 전송
13-3 DispacherServlet 설정
DispatcherServlet 설정
설명
*web.xml이 생소하다면 JSP, Servlet등의 레퍼런스를 검색해본다. 1. web 어플리케이션의 가장 첫 관문이자. 사거리의 신호등과도 같다. 2. servlet에 DispatcherServlet을 설정해준다. 3. org.springframework.web.servelt.dispacherServlet설정 4. init-param에 스프링 설정파일도 설정해준다. (web.xml이라는 기존 설정에 Dispatcher를 삽입하는 과정)
좌측 그림은 초기화 파라미터에서 스프링 설정 파일을 했냐 안했냐의 따라서 어떻게 컨테이너가 설정되는가에 대한 그림이다.
1. 스프링 설정파일(초기화 파리미터) 경우(일반적인 방법) - 초기화 파라미터에서 지정한 파일(servlet-context.xml)을 이용하여 스프링 컨테이너를 생성 2. 초기화 하지 않은 경우 - appServlet-context.xml을 이용한 스프링 컨테이너를 자동으로 생성