전체 글 205

게시글 목록

Servlet/JSP 답변형 게시판 만들기 - 게시글 목록 개발 순서 VO DAO 테스트 DAO Service Controller View com.coco.vo.BoardVO 테이블 이름과 동일하게 변수를 선언한다. public class BoardVO { private int bno; private int p_bno, level; //level은 답글의 개수다. private String title, content, imgName, id; private Date regdate; ...Getter Setter toString 생성자 생략... level은 답글의 개수를 나타내는 칼럼이다. 실제로 존재하지 않는 컬럼이지만 쿼리로 직접 만들어서 쓴다. com.test.dao.BoardDAOTest 게시물 목..

[문제점]MySQL에서 계층형 쿼리와 그 외...

MySQL에서 계층형 쿼리 문제 이 게시판은 자바 웹을 다루는 기술을 참고해서 만들었다. 처음부터 난관이었던 게 책은 Oracle SQL을 사용하는 반면 나는 MySQL을 쓰고 싶었다. MySQL을 고집한 이유는 첫 프로젝트 때 사용했던 DB가 MySQL이었기 때문에... 라고는 하지만 딱히 없다. MySQL을 잘 다루는 것도 아니므로 Oracle을 썼어도 상관 없었겠지만 왠지 그냥 난 책이랑 다르게 하고 싶어! 책을 참고하되, 베끼고 싶지 않은 마음... 아주 작은 부분이라도 차별되는 지점을 만들고 싶었다. 물론 어디까지나 변명일 뿐이다. 하여간. 오라클은 자체적으로 계층형 쿼리를 다룰 수 있는 명령어(?) START WITH, CONNECT BY를 제공한다. 그러나 MYSQL은 그런 게 없었으므로....

구조 및 세팅

1. 구조 모델2 방식인 MVC구조로 만들 것이다. 컨트롤러와 DAO 사이에 왜 Service가 필요할까? 트랜잭션Transaction 때문이다. 조승우가 자주 가는 커뮤티니 사이트를 예로 들어보자. 조승우는 커뮤니티 사이트에서 '비밀의 숲2 기대된다 토요일 첫 방!!'이라는 게시물을 조회하려고 한다. 현재 조회수는 3944. 조승우가 게시물을 클릭해서 조회페이지로 이동하면 조회수가 3945가 되어야 한다. 그러니까 조회하는 쿼리와, 조회수를 증가시키는 쿼리를 동시에 처리해야 한다는 것이다. 만약 이 두 가지가 따로 동작한다고 해보자. 그러면 (아주 짧은 찰나겠지만) 아직 조회 전인데 조회수가 1이 증가하거나, 이미 조회했는데 조회수가 그대로일 것이다. 이런 일이 발생하지 않도록 두 개 이..

Model2 - MVC

모델 ? 어떤 일이든 주로 사용하는 방식이 있다. 그들만의 룰. 우리는 '표준'이라고 한다. 웹 개발도 마찬가지다. 꼭 그래야만 할 필요는 없지만 웬만하면 이런 구조로 만들자, 고 하는 '표준'이 있다. 이것을 모델이라고 한다. Model1 비즈니스 로직과 화면 처리를 하나의 JSP가 모두 처리하는 것이 모델1 방식이다. 그러니까 지금까지는 one.jsp는 브라우저의 요청을 받아서 비즈니스 로직을 수행한 뒤, 다시 화면까지 처리하는 구조였다. 모델1 방식의 장점이라면 구현이 쉽고 편하다는 것이다. 그러나 화면이 복잡해지면 화면 처리와 비즈니스 로직이 섞일 위험이 있다. 그럼 붕괴된 도로처럼 유지 보수하기가 힘들어진다. Model2 모델2 방식의 핵심은 클라이언트의 요청/응답 처리, 비즈니스 로직 처리를 ..

Servlet-JSP 2020.09.11

JSTL

JSTL(JSP Standard Tag Library) EL이나 액션 태그를 이용해도 여전히 자바 코드를 사용할 수밖에 없는 상황이 있다. 이를테면 반복문이나 조건문 같은 것을 쓸 때. 이것을 제거하기 위해 커스텀 태그가 등장했다. 커스텀 태그는 자바 코드를 대체하기 위해 만든 태그다. JSTL은 커스텀 태그의 한 종류다. JSTL 라이브러리 설정 우선 사용하기 위해서 라이브러리를 설치해야 한다. 링크 초록색 테두리 안에 네 개의 라이브러리를 받는다. WebContent - WEB-INF - lib 안에 다운 받은 라이브러리를 넣는다. 라고 고쳐써야 한다. JSTL의 태그 종류 라이브러리 세부 기능 접두어 관련 URL 코어 변수지원, 흐름제어, 반복문, URL처리 c http://java.sun.com/..

Servlet-JSP 2020.09.11

표현언어(EL, Expression Language)

표현언어 EL 액션태그에 이어서 JSP에서 자바 코드를 없애려는 노력은 계속되었다. EL은 좀 더 편리하게 자바 표현식을 다루기 위해 JSP2.0부터 도입되었다. 데이터를 출력하는 역할을 한다. 특징 기존 표현식보다 편리하게 값을 출력한다. 변수와 여러 연산자를 포함할 수 있다. JSP 내장 객체에 저장된 속성 및 자바 빈 속성도 출력할 수 있다. EL 자체 내장 객체를 제공한다. JSP 생성 시 기본 설정으로는 EL을 사용할 수 없다. 페이지 디렉티브 태그에서 반드시 isELIgnored=false로 설정해야 한다. 형식 ${표현식 또는 값} ${1+1 == 2 ? "hello" : "world"} ${number} EL의 자료형과 연산자 자료형 boolean 정수 실수 문자열('', "..

Servlet-JSP 2020.09.11

액션 태그

액션 태그 JSP는 비즈니스 로직과 화면 개발을 분리하려는 목적으로 개발되었다. 그러나 여전히 스크립트릿같은 녀석들이 HTML 영역을 침범했다. 방역하고 방역해도 죽지 않는 코로나처럼. 죽일 순 없으니 마스크라도 쓰자...는 마음으로 만들어진 것이 액션 태그다. 인클루드 액션 태그 jsp:include... 파라미터 인자로 받는 이미지 파일 이름을 읽어서 화면에 나타내는 jsp를 만든다. 1에서 만든 jsp를 다른 jsp들이 include 태그를 이용하여 재사용한다. 이런 방식의 장점은 자바 코드를 한 번만 쓰면, 남은 페이지에서 자바 코드를 쓸 일이 없다는 것이다. 1번 jsp 이름은 자바코드 없이 include태그로 1번을 재사용하는 jsp 폐허한 지구의 두 친구 폐허한 지구 만약 한글 이름을 전달하..

Servlet-JSP 2020.09.11

JSP😇

JSP? 먼 옛날. 서블릿 위에 html태그를 써서 화면으로 전달하던 시절. 디자이너와 개발자는 서로 얼굴 붉힐 일이 많았을 것이다. 이런 일이 있었다. 디자이너는 오늘 일찍 퇴근해서 애인과 종로에서 가장 오래된 레스토랑인 아지오에 갈 생각이다. 그런데 개발자라는 작자가 작업을 끝내지 못해서 오전 내 작업을 못하고 있다. 오후 세시께야 파일을 받았다. 디자이너는 세 시간 안에 작업을 끝내겠다는 생각으로 열의를 불태운다. 흠. 너무 과했던 모양이다. 실수로 자바 코드 몇 개를 건드렸는데...controll + z도 안 먹는다... 그렇게 디자이너와 개발자 사이는 비포장도로처럼 위태로워졌을 것이며 어쩌면 타이어에 펑크가 났을지도 모르는 일이다. 이런 배경에서 누군가. 그러니까 평화를 지향하던 인간 하나가 J..

Servlet-JSP 2020.09.11

서블릿 리스너

Servlet Listener API 서블릿에서 발생하는 이벤트를 처리할 수 있도록 제공하는 리스너 Listener의 메서드 서블릿 관련 Listener 추상 메서드 기능 ServletContextAttributeListener attributeAdded() attributeRemoved() attributeReplaced() Context객체에 속성 추가/제거/수정 이벤트 발생 시 처리 HttpSessionListener sessionCreated() sessionDestroyed() 세션 객체의 생성/소멸 이벤트 발생 시 처리 ServletRequestListener reqeustInitialized() requestDestroyed() 클라이언트의 요청 이벤트 발생 시 처리 ServletReques..

Servlet-JSP 2020.09.11

Servlet Filter

서블릿 필터 요청/응답과 관련된 작업을 미리 처리한다. 이를테면 setCharacterEncoding()같은 귀찮은 작업을 필터에 설정해두면 요청/응답할 때 알아서 한다. Request Filter - Response Filter 필터는 크게 요청 필터와 응답 필터로 나눌 수 있다. 요청 필터 사용자 인증 및 권한 검사 요청 시 요청 관련 로그 작업 인코딩 응답 필터 응답 결과에 대한 암호화 서비스 시간 측정 관련 API javax.servlet.Filter javax.servlet.FilterChain javax.servlet.FilterConfig Filter인터페이스의 메서드 Method 기능 destroy() 필터 소멸 시 컨테이너에 의해 호출되어 종료 작업 수행 doFilter() 요청/응답 시..

Servlet-JSP 2020.09.11

서블릿 스코프

Servlet Scope! 서블릿 속성attribute 세 가지 ServletContext HttpSession HttpServletRequest 각 속성을 setAttribute()로 바인딩하고 getAttribute()로 꺼내서 쓴다. 서블릿 스코프scope란, 서블릿 속성에 접근할 수 있는 범위를 말한다. servlet scope ! 스코프 종류 해당 서블릿API 속성의 스코프 애플리케이션 스코프 ServletContext 속성은 애플리케이션 전체에서 접근할 수 있다. 세션 스코프 HttpSession 속성은 브라우저에서만 접근할 수 있다. 리퀘스트 스코프 HttpServletRequest 속성은 해당 요청-응답 사이클 안에서만 접근할 수 있다. 스코프의 기능 로그인 상태 유지 장바구니 MVC - ..

Servlet-JSP 2020.09.11

스프링 시큐리티 한글 설정(Java config)

스프링 시큐리티 한글 설정 게시판에 스프링 시큐리티를 접목하여 로그인한 사용자만 게시물을 등록할 수 있게 했다. 그런데 갑자기 한글 인코딩이 되지 않는 문제가 발생했다. https://stackoverflow.com/questions/20863489/characterencodingfilter-dont-work-together-with-spring-security-3-2-0 이 답변에 따르면, "We need to add CharacterEncodingFilter before filters who read request properties for the first time. There is securityFilterChain (stands second. after metrica filter) and we ..

ERROR!!!!!!! 2020.09.11

세션 로그인 예제

서블릿과 DB를 연동해서 ID 체크를 하고, 로그인 상태를 유지하는 예제다. 순서는 이렇다. login.html에서 아이디와 비밀번호를 입력한다. LoginServlet은 입력 받은 ID로 DB에 조회한다. 없는 아이디라면 login.html로 돌려보낸다. 있는 아이디라면 /show로 이동하여 회원 정보를 확인할 수 있다. VO public class MemberVO { private String id; private String pwd; private String name; private String email; private Date regdate; //Getter Setter 생략... ... ... } DAO public class MemberDAO { private Connection con; ..

Servlet-JSP 2020.09.10

encodeURL()

쿠키를 사용하지 않겠다고 설정한 브라우저에서는 쿠키는 물론 세션도 사용할 수 없다. 이런 경우, encodeURL()로 직접 서버에서 브라우저로 응답을 보낸 후, URL Rewriting을 이용해 JSESSIONID를 서버로 전송하여 세션 기능을 사용할 수 있다. package pro09.sec04; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; impor..

Servlet-JSP 2020.09.10

세션

Session ** 웹 페이지들 사이에서 공유하는 정보를 서버에 저장해두고, 웹 페이지들을 매개한다는 점에서 세션도 쿠키와 다르지 않다. 다른 점이라면 쿠키는 클라이언트 PC에 저장되고, **세션은 서버 메모리에 저장된다는 점이다. 쿠키에 비해 보안이 좋기 때문에 로그인처럼 보안을 요구하는 데이터를 다룰 때 세션을 이용한다. 세션은 브라우저 당 하나가 생성된다. 세션의 특징 데이터를 서버 메모리에 저장한다. 블아줘의 세션 연동은 쿠키를 이용한다. 쿠키보다 보안에 유리하다. 서버에 부하를 줄 수 있다. 브라우저 당 하나의 세션SessionID이 생성된다. 세션은 유효시간을 가진다.(기본 30분) 로그인 유지, 장바구니 등에 주로 사용한다. 세션 생성 과정 브라우저로 사이트에 접속한다. 서버는 접속한 브라우..

Servlet-JSP 2020.09.10

쿠키

세션 트래킹 HTTP프로토콜 방식으로 통신하는 웹 페이지는 서로 어떤 정보도 공유하지 않는다. 쿠팡 메인 페이지에서 로그인하고 주문 페이지에서 또 다시 로그인하지 않아도 되는 이유는 세션 트래킹Session Tracking이라는 웹 페이지 연결기능을 구현했기 때문이다. HTTP프로토콜은 서버-클라이언트 통신 시 스테이트리스stateless방식으로 통신한다. 브라우저에서 새 웹 페이지를 열면 이전 웹 페이지에 대한 어떤 정보도 새 웹페이지는 알 수 없다. stateless란, 각각 웹 페이지 정보, 상태를 다른 웹페이지와 공유하지 않는 방식을 말한다. 따라서 웹 페이지를 서로 연결하기 위해 세션 트래킹을 이용해야 한다. 웹 페이지를 연동하는 방법은 몇 가지가 있다. hidden 태그 URL Rewritin..

Servlet-JSP 2020.09.10

ServletContext & ServletConfig

이미지 출처 : https://www.oreilly.com/library/view/head-first-servlets/9780596516680/ch05s10.html ✔ javax.servlet.ServletContext 특징 서블릿 - 컨테이너 연동을 위해 사용한다. 컨텍스트(웹 애플리케이션)마다 하나의 ServletContext가 생성된다. 서블릿끼리 자원을 공유하는 데 사용한다. 컨테이너 실행 시 생성되고 종료 시 소멸한다. 제공하는 기능 서블릿에서 파일 접근 자원 바인딩 로그 파일 컨텍스트에서 제공하는 설정 정보 제공 ServletContext의 메서드 /*주어진 name을 이용해 바인딩된 value를 가져온다.*/ getAttribute(String name) /*바인딩된 속성들의 name을 반..

Servlet-JSP 2020.09.10

바인딩

바인딩 웹 프로그램 실행 시 자원(데이터)을 서블릿 관련 객체에 저장하는 방법 GET방식으로 많은 데이터를 전달하기에 한계가 있다. 많은 양의 데이터를 전달할 때 바인딩binding을 사용한다. 그냥 key-value다. /*데이터를 각 객체에 바인딩한다.*/ setAttribute(String name, Object obj) /*각 객체에 바인딩된 데이터를 name으로 가져온다.*/ getAttribute(String name) /*각 객체에 바인딩된 데이터를 name으로 제거한다.*/ removeAttribute(String name) 예제 보내는 쪽 @WebServlet("/bind") public class BindingTestServlet extends HttpServlet { public vo..

Servlet-JSP 2020.09.10

Connection Pool

커넥션 풀 웹 애플리케이션이 실행됨과 동시에 연동할 데이터베이스와 미리 연결 해둔다. 필요할 때마다 미리 연결해놓은 상태를 이용해 빠르게 데이터베이스 관련 작업을 할 수 있다. 요약하자면 미리 데이터베이스와 연결 시킨 상태를 유지하는 기술을 커넥션 풀이라 부른다. JDBC의 문제점은 오래 걸린다는 것이다. Connection Pool객체를 이용하면 미리 연결된 상태를 유지하므로 빠르게 작업할 수 있다. 커넥션 풀 동작과정 톰캣 컨테이너 실행 Connection pool 객체 생성 커넥션 객체 DBMS 연결 데이터베이스와 연동 작업 시, ConnectionPool이 제공하는 메서드를 호출 톰캣은 자체적으로 ConnectionPool을 제공한다. JNDI Java Naming and Directory Int..

Servlet-JSP 2020.09.10

포워드

Forward 하나의 서블릿에서 다른 서블릿 또는 JSP와 연동하는 방법을 포워드라고 한다. 요청에 대한 추가 작업을 다른 서블릿에서 수행하게 한다. 요청에 포함된 정보를 다른 서블릿, JSP와 공유할 수 있다. 요청에 정보를 포함시켜 다른 서블릿에 전달할 수 있다. Model2 개발 시 서블릿에서 JSP로 데이터를 전달하는 데 사용한다. 네 가지 포워드 1.redirect HttpServletResponse객체의 sendRedirect() 이용 웹 브라우저에 재요청하는 방식 예시 sendRedirect("/board/register"); 2. Refresh HttpServletResponse의 addHeader() 이용 웹브라우저에 재요청 예시 response.addHeader("Refresh",경과시..

Servlet-JSP 2020.09.10

JDBC

비즈니스 로직 클라이언트로부터 받은 요청을 처리하는 과정을 비즈니스 로직이라 한다. 이를테면 쇼핑몰에서 클라이언트가 1번 상품 정보를 요청한다. 그럼 서버는 데이터베이스에 1번 상품 정보를 조회한다. 조회 결과를 클라이언트에게 반환하기까지 수행하는 작업이 비즈니스 로직이다. 서블릿 - DB 연동 실습 MySQL -- table 생성 CREATE TABLE `servletex`.`t_member` ( `id` VARCHAR(30) NOT NULL, `pwd` VARCHAR(50) NOT NULL, `name` VARCHAR(50) NULL, `email` VARCHAR(50) NULL, `regdate` TIMESTAMP NOT NULL DEFAULT now(), PRIMARY KEY (`id`)); --..

Servlet-JSP 2020.09.10

GET & POST

📚 자바 웹을 다루는 기술을 정리한 내용입니다. GET 방식 서블릿에 데이터를 전송할 때 데이터가 URL 뒤에 따라 붙는다. 여러 개의 데이터를 전송할 때는 '&'로 구분한다. 보안 취약 전송할 수 있는 데이터는 최대 255자 기본 전송 방식이며 사용이 쉽다. 웹 브라우저에 직접 입력해서 전송할 수도 있다. 서블릿에서는 doGet()으로 전송 받은 데이터를 처리한다. POST 방식 서블릿에 데이터를 전송할 때는 TCP/IP 프로토콜 데이터의 HEAD영역에 숨겨진 채 전송된다. 보안에 유리하다. 전송 데이터 용량이 무제한. 전송 시 서블릿에서 다시 가져오는 작업을 해야 하므로 속도가 GET보다 느리다. 서블릿에서는 doPost()를 이용해 처리한다. 아무튼 GET방식이든 POST방식이든. 어..

Servlet-JSP 2020.09.10

Request - Response

서블릿의 기본 기능 톰캣과 같은 Web Application Server(이하 WAS)가 처음 나왔을 때 웹 브라우저 요청을 쓰레드 방식으로 처리하는 기술이 서블릿이었다. 서블릿은 자바로 웹 프로그래밍을 하는 데 있어서 가장 기초가 되는 내용이다. 서블릿 기본 기능 수행 과정 클라이언트로 요청을 받는다. 데이터 베이스와 연동 하여 비즈니스 로직을 처리한다. 처리된 결과를 다시 클라이언트에게 돌려준다. HttpServletRequest & HttpServletReponse HttpServletRequest 요청을 돕기 위한 클래스 HttpServletResponse 응답을 돕기 위한 클래스 요청과 응답 login.html 아이디 : 비밀번호: 확인 LoginServlet.java package com.co..

Servlet-JSP 2020.09.10

Servlet

📚 자바 웹을 다루는 기술을 정리한 내용입니다. Servlet이란? 이전에 정적인 웹을 너머서 동적 웹 프로그래밍을 위한 자바 클래스다. 클라이언트 요청에 따라 서버에서 동적으로 서비스를 제공하는 클래스 서블릿은 일반적인 자바와 달리 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다. 서블릿의 동작 과정이다. 클라이언트가 요청하면 web server는 WAS에 위임한다. WAS는 각 요청에 해당하는 서블릿을 실행한 다음 결과를 반환하여 클라이언트에게 전송한다. 특징 서버 쪽에서 실행되면서 기능 수행 정적 웹 문제를 보완하여 동적 기능 제공 쓰레드 방식으로 실행 컨테이너에서 실행 Servlet API 계층 구조 두 인터페이스 Servlet, ServletConfig를 추상클래스 GenericServl..

Servlet-JSP 2020.09.10

Hassing & HashFunction

잘못된 내용이 있을 수 있습니다.해싱과 해시함수 해싱이란 해시함수를 이용해서 데이터를 헤시테이블에 저장하고 검색하는 기법이다. 해시함수는 데이터가 저장되어 있는 곳을 알려주므로 다량의 데이터 중에서도 원하는 데이터를 빠르게 찾을 수 있다. 해싱을 구현한 클래스로 HashSet, HashMap, Hashtable 등이 있다. Hashtable은 컬렉션프레임웍 도입(JDK1.8)이후 HashMap으로 대체 되었다. 해싱의 자료 구조 HashMap을 이용해 아주 복잡한 이름을 가진 모델명과 제조사를 묶어서 데이터를 보관해둔다고 하자. 나는 이 복잡한 이름의 모델명을 가진 제품의 제조사를 자주 구분해야 할 필요가 있다. 중복되지 않는 모델명을 key로 두고 언제든 key를 이용해 value에 접근할 수 있게 만..

Java 2020.09.10

예외처리

예외 Exception 이미지 출처 예외 클래스 다이어그램 자바에서 에러는 크게 두 갈래로 나눌 수 있다. error exception 예외exception는 처리할 수 있지만, 에러는 손 쓸 방법이 없다. Exception은 RunTimeException과 그 외 Exception 두 갈래로 다시 나뉜다. 다이어그램을 자세히 보면 RuntimeException은 Unckecked, 그 외 Exception은 Checked라고 표시되어 있다. checked - unchecked check : 컴파일러가 예외 체크 (Exception클래스) unchecked : 컴파일러가 예외 체크 x (RuntimeException) 언체크드 예외인 RuntimeException은 선택적으로 처리할 수 있다. 그러니까 ..

Java 2020.09.10

람다Lambda

📚 자바의 정석을 정리한 내용입니다. ▪ 람다식Lambda Expression 자바는 두 번의 큰 변화가 있었다. JDK1.5의 지네릭스. JDK1.8의 람다. 람다의 등장으로 객체지향언어를 너머 함수형 언어가 가진 기능까지 갖추게 되었다. 말하자면 비로소 호모 사피엔스의 길에 접어든 것일까? 람다식이란 간단히 메서드를 하나의 식으로 표현한 것이다. 함수를 간략하면서도 명확한 식으로 편할 수 있다. 메서드를 람다식으로 표현하면 반환 값이 없어진다. 그래서 익명 함수라고 부르기도 한다. 그래서 어떻게 쓰는 거냐면. int max(int a, int b) { return a > b ? a:b; } 두 값을 입력받고 큰 값을 반환하는 max라는 메서드가 있다. 이것을 람다로 변환하면 이렇게 쓸 수 있다. (i..

Java 2020.09.09

와일드카드

참고 : 자바의 정석 와일드 카드 기호 '?' 표현하는데, 와일드카드는 어떤 타입도 될 수 있다. 아래 코드를 보자. package com.javaex.generics; import java.util.ArrayList; import java.util.List; public class FruitsBoxEx3 { public static void main(String[] args) { FruitBox fruitBox = new FruitBox(); FruitBox appleBox = new FruitBox(); fruitBox.add(new Apple()); fruitBox.add(new Grape()); appleBox.add(new Apple()); System.out.println(Juicer.make..

Java 2020.09.09