오류내용
Cannot create PoolableConnectionFactory
원인
위의 에러는 jdbc 연결 시 db 연결이 제대로 이루어지지 않았기 때문에 발생한 오류다. 
자세하게, db연결이 로컬->db는 가능하나 was->db로 불가능 하다는 점이다.
해결
 timezone 설정 및 텔넷 포트 하나하나 확인 해보았고 결국 config(application.property.properties의 암호가 업데이트 되어있지 않아 생긴 오류였다...
오류발생 
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처리를 안 하면 위와 같은 에러 메시지를 보여준다. 
custsvc.url=jdbc:mysql://csdb.tmonc.net:3306/custsvc?useSSL=false&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useAffectedRows=true

 

'TMON > 개선작업' 카테고리의 다른 글

[CS] DB과부하 방지 Cache처리(캐싱처리)  (0) 2021.12.17

목차 돌아가기

클라이언트와 서버의 연결을 유지하는 방법

20-1 세션(Session)과 쿠키
  세션 쿠키
특징
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) 쿠키를 생성할 때는 생성자에 두 개의 파라미터를 넣어주는데 첫 번째는 쿠키이름을 넣어 주고 두 번째는 쿠키값을 넣어준다.

- setMaxAge(60*60*24*30) :
60초 * 60 * 24 * 30 = 1달
@CookieValue 에노테이션
: value속성은 쿠키이름을 나타내며 만약 value에 명시한 쿠키가 없을 경우 exception이 발생한다 그런 것을 방지하고자 required 속성이 있다. Required 속성은 기본 true인데 true인 경우 value값에 해당하는 쿠키가 없으면 exception이 발생하고 false이면 exception이 발생하지 않는다.
실제 실무에선 세션을 사용한다.(보안에 쿠키에 비교적 좋음) 쿠키는 보통 중요정보가 아닐 때 사용한다.

'Spring > [인프런] Spring FrameWork' 카테고리의 다른 글

Spring JDBC 연동 & JDBC Template  (0) 2022.01.08
리다이렉트, 인터셉트  (0) 2022.01.06
Controller 객체 구현  (0) 2021.12.31
Service & Dao 객체 구현  (0) 2021.12.30
스프링 MVC 웹서비스  (0) 2021.12.29

목차 돌아가기

컨트롤러의 URL 맵핑과 파라미터 처리 방법에 대해서 학습

18-1 웹 어플리케이션 준비
주요 구조
18-2 @RequestMapping을 이용한 맵핑(여러가지 속성)
html, controller 비교 설명
*좌측 : 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("뷰이름")
차이점 정리

 

'Spring > [인프런] Spring FrameWork' 카테고리의 다른 글

리다이렉트, 인터셉트  (0) 2022.01.06
세션, 쿠키  (0) 2022.01.03
Service & Dao 객체 구현  (0) 2021.12.30
스프링 MVC 웹서비스  (0) 2021.12.29
웹 프로그래밍 설계 모델(MVC)  (0) 2021.12.28

목차 돌아가기

웹 프로그래밍의 구조에서 Service와 DAO 객체의 구현에 대해서 학습합니다.

 

17-1 웹 어플리케이션 준비
특히 Service, DAO(Data Access Object) 쪽을 추가적으로 다룰 예정이다.
17-2 한글처리

web.xml에 한글처리 관련 코드를 추가해준다.

<!-- 한글처리 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter     
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>   
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>  
			<param-value>true</param-value>
		</init-param>
	</filter>    

	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>  <!-- 모든 것 -->                
	</filter-mapping>

 

17-3 서비스 객체 구현
방법 설명
Service 객체 생성
MemberService service = new MemberService();
- 과거 순수 자바 이용 방법


Service 객체 생성
@Autowired
MemberService service;
- @Autowired 빈 객체 주입 

가장 실무에서 많이 쓰이는 방법

1. Service 객체 명시한다.
- @Service를 맨위에 붙힌다. (기타 : @Component, @Repository 셋 다 가능. ) 
2. MemberService service
17-4 DAO 객체 구현
방법 설명
 

1. 맨위에 @Component, @Repository를 명시한다.
- 쓰고 싶을 때 @Autowired를 붙여서 사용하면 된다.
1. Contoller를 통해 파라미터를 받아온다.
2. Service를 통해서 해당 파라미터에 특정한 기능(System.out.print() 등등)과 같은 기능을 처리 한후 DAO로 전달한다.
3. DAO에서는 DB에 (수정, 삭제, 추가)를 직접 담당한다.

'Spring > [인프런] Spring FrameWork' 카테고리의 다른 글

세션, 쿠키  (0) 2022.01.03
Controller 객체 구현  (0) 2021.12.31
스프링 MVC 웹서비스  (0) 2021.12.29
웹 프로그래밍 설계 모델(MVC)  (0) 2021.12.28
어노테이션을 이용한 스프링 설정 -1  (0) 2021.12.27

목차 돌아기기

스프링 MVC 프레임워크를 이용한 웹 프로그래밍 구현방법을 학습

14-1 웹 서버(Tomcat) 다운로드

완료

14-2 웹 서버(Tomcat) 와 이클립스 연동

완료

14-3 이클립스에 STS(Spring Tool Suit)설치
STS를 활용하여 기존의 설정해야만 했던 web.xml등과 같은 설정을 자동으로 해주며 개발자의 수고를 덜어준다.
intelliJ에서 STS 설정하기 설명
1.maven 프로젝트 설정
2. Spring MVC 설정
3. web.xml 변경
4. Artifact-Spring 라이브러리 추가(오른쪽 스프링 라이브러리 두개 더블클릭)
5. pom.xml 라이브러리 dependency추가 (maven 자동 import 설정)
참고 https://developyun.tistory.com/12
14-4 STS를 이용한 웹프로젝트 생성
14-5 스프링 MVC 프레임워크를 이용한 웹프로젝트 분석

직접 login 메소드 실행하기
Controller 생성
@Controller
public class Login {
    @RequestMapping(value="/login", method = RequestMethod.GET)
        public String login(Model model){
            model.addAttribute("loginKey", "loginValue");
            return "login"; //login.jsp
        }
}
login.jsp 생성
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Login</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  loginKey is ${loginValue}. </P>
</body>
</html>
실행화면

 

https://programmers.co.kr/learn/courses/30/lessons/49994

 

코딩테스트 연습 - 방문 길이

 

programmers.co.kr

문제 설명
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 

방문 간선 체크 방법(사차원 배열처리)

map[시작x좌표][시작y좌표][도착x좌표][도착y좌표] = 1
map[도착x좌표][도착y좌표][시작x좌표][시작y좌표] = 1
코드
#include <string>
#include <vector>
using namespace std;

bool map[11][11][11][11] = {false,};
int solution(string dirs) {
    int answer = 0;
    int curX = 5;
    int curY = 5;
    for(int i =0 ; i < dirs.size(); i++){
        char dir = dirs[i];
        if(dir == 'U') {
            if(curY+1 < 11) {
                if(map[curX][curY][curX][curY+1] != 1) {
                    // 간선의 방문여부를 체크해야 하기 때문에 양방향 다 방문으로 체크
                    map[curX][curY][curX][curY+1] = 1;
                    map[curX][curY+1][curX][curY] = 1;
                    answer++;
                }
                curY++;
            }
        }

        else if(dir == 'D') {
            if(curY-1 >= 0) {
                if(map[curX][curY][curX][curY-1] != 1) {
                    map[curX][curY][curX][curY-1] = 1;
                    map[curX][curY-1][curX][curY] = 1;
                    answer++;
                }
                curY--;
            }
        }

        else if(dir == 'L') {
            if(curX-1 >= 0) {
                if(map[curX][curY][curX-1][curY] != 1) {
                    map[curX][curY][curX-1][curY] = 1;
                    map[curX-1][curY][curX][curY] = 1;
                    answer++;
                }
                curX--;
            }
        }

        else if(dir == 'R') {
            if(curX+1 < 11) {
                if(map[curX][curY][curX+1][curY] != 1) {
                    map[curX][curY][curX+1][curY] = 1;
                    map[curX+1][curY][curX][curY] = 1;
                    answer++;
                }
                curX++;
            }
        }
    }
    return answer;
}

목차 돌아가기

스프링 MVC 프레임워크 기반의 웹 프로그래밍 구조에 대해서 학습

13-1 웹 프로그래밍 구축하기 위한 설계모델

  • 모델1 방식 (절차형 방식)
  • 모델2 방식 (MVC 방식)

모델1 방식 (기존방식 : 절차형 방식)

기본적인 설계 모델 흐름
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)

  1. 클라이언트가 요청한 URL을 DispatcherServlet이 가로챈다. (web.xml에 DispatcherServlet 등록)
  2. 가로챈 정보를 HandlerMapping에게 보내 요청을 처리할 수 있는 Controller를 찾아낸다. 디폴트 전략 : BeanNameUrlHandlerMapping, DefaultAnnotationHandlerMapping
  3. 요청을 찾은 컨트롤러에게 보낸다. (컨트롤러 → 개발자 구현 영역)
  4. 컨트롤러에서 해당 요청 처리 후 요청을 응답받을 View의 이름을 리턴. 이 이름을 ViewResolver가 먼저 받아 해당하는 View가 있는지 검색
  5. 해당 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을 이용한 스프링 컨테이너를 자동으로 생성 
13-4 Controller 객체 - @Controller
흐름 설명
1. Controlle는 개발자가 만드는 것
위는 선언
아래는 컨테이너 정의 하는 것
13-5 Controller 객체 - @RequestMapping
흐름 설명
1. Controller에서 적당한 메서드를 HandlerAdapter가 찾는과정
2. Controller에 메서드에 RequestMapping("/method")를 붙여준다. (요청 : localhost8090/ch08/success)
13-6 Controller 객체 - Model 타입의 파라미터
흐름 설명
1. 모델과 뷰를 컨트롤러가 보내준다. 

1. 개발자는 Model 객체 데이터를 담아서 DispatcherServlet에 전달 가능하다.
2. DispacherServlet에 전달된 Model 데이터는 View에서 가공되어 클라에게 응답처리한다.
13-7 View 객체
흐름 설명

 
- InternalResourceViewResolver가 view파일을 보낸다.
JSP파일명 설정(bean)
return : "success"
1. prefix /WEB-INF/views
2. suffix .jsp
3. JSP파일명 : /WEB-INF/views/success.jsp

13-8 전체적인 웹프로그래밍 구조

전체적인 흐름

4,5번 과정에서 Service, DAO, DB를 거치고 View, Model을 가져온다.

 

'Spring > [인프런] Spring FrameWork' 카테고리의 다른 글

Service & Dao 객체 구현  (0) 2021.12.30
스프링 MVC 웹서비스  (0) 2021.12.29
어노테이션을 이용한 스프링 설정 -1  (0) 2021.12.27
생명주기(Life Cycle)  (0) 2021.12.24
의존객체 선택  (0) 2021.12.24

+ Recent posts