ALL Post 204

[문제점]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