ㅁ 패키지, 클래스 생성
- 소스폴더인 src/main/java에 패키지를 만든다.
- 이 때 세번째 까지는 com.br.web으로 시작한다.
패키지 첫번째 레벨, 두번째 레벨은 주로 도메인의 역순이다라는 가정 하에 작성했고,
세번째 레벨에 주로 어플리케이션명을 따서 쓴다.
- 지금 web이라 한 이유는 나중에 스프링 프로젝트를 개발하게 되면
context path가 세번째 레벨로 잡히게 되어 있다.
- 네번째 레벨부터 쪼개진다.
src/main/java
ㄴ com.br.web.member.controller
ㄴ com.br.web.member.model.vo
ㄴ com.br.web.member.model.service
ㄴ com.br.web.member.model.dao
ㄴ com.br.web.common.template.JDBCTemplate
ㄴ db.config
ㄴ db.mappers
- view 패키지는 필요 없다. view가 곧 화면이다.
- JDBCTemplate 클래스에 매번 반복적으로 작성될 코드를 따로 한번만 정의했다.
JDBCTemplate 클래스에서 Connection 객체 생성, Connection, Statement, Resultset 반납처리, 트랜잭션 처리(commit, rollback) 등을 한다.
- db.config에 driver.properties를 둔다. (우클릭 - new - file)
- db.mappers에 member-mapper.xml, notice-mapper.xml, board-mapper.xml 등을 둔다.
ㅁ src/main/java에서 작업한 일반 파일들도 webapp > WEB-INF > classes 폴더 안에 동기화가 진행된다.
ㅁ JDBCTemplate의 getConnection() 메소드
- 드라이버 경로 oracle.jdbc.driver.OracleDriver는 ojdbc6.jar 파일이 제공하는 클래스다.
그래서 저 클래스를 정상적으로 찾기 위해서는 ojdbc6 라이브러리가 연동되어 있어야 한다.
- localhost는 db가 구축되어 있는 서버의 ip 주소다.
현재 각자 로컬 db를 쓰고 있다. 그래서 localhost를 제시한다.
ㅁ properties 파일은 git에 안올린다.
- 이런 환경설정 관련 파일은 git에 올리면 안 된다. gitignore로 properties 파일을 제외했다.
- git에 올리지 않으므로 각자 직접 만들어줘야 한다.
ㅁ driver.properties
- 우리가 실제 읽어들여야 하는 파일은 src/main/java/db.config의 driver.properties 파일이 아니라,
webApp/src/main/webapp/WEB-INF/classes/db.config의 driver.properties 파일이다.
- WEB-INF/classes에 있는 파일의 물리적인 경로를 알아내서
prop.load(new FileInputStream( 여기 ));
여기에 반영을 시켜야 한다.
※ String filePath = JDBCTemplate.class.getResource("/db/config/driver.properties").getPath();
- "JDBCTemplate.class" 하면 webApp/src/main/webapp/WEB-INF/classes/com/br/web/common/template 폴더의 "JDBCTemplate.class" 파일을 가리킨다.
- 여기에 "getResource()"로 경로를 작성한다. driver.properties 파일을 찾기 위한 일부 경로를 작성한다.
여기서의 슬래시는 현재 이 (컴파일된) 클래스 파일이 위치해 있는 폴더의 루트 폴더를 가리킨다.
루트 폴더가 바로 classes 폴더다.
- classes 폴더 안에 db 폴더가 있고, 그 안에 또 config 폴더 있고, 그 안에 driver.properties가 있었다.
- getResource() 메소드에 의해 driver.properties 파일이 찾아지고, 이 파일의 물리적인 경로를 알아내고자 한다면 getPath() 메소드까지 호출해야 한다.
- 현재 변수 filePath에
"C:\workspaces\05_jspServlet-workspace\webApp\src\main\webapp\WEB-INF\classes\db\config\driver.properties"가 담겨있다.
- 윈도우 환경이어서 c드라이브부터의 경로지, 실서버는 리눅스 환경으로 구성되어 있을 것이다.
getPath() 메서드를 사용하여 경로를 가져오면 운영체제마다 다른 물리적 경로가 반환된다.
ㅁ driver.mappers
- 이 문서의 유형을 properties 문서 유형으로 해야하기 때문에
!DOCTYPE properties 하고 그 뒤에, SYSTEM하고 어떤 url 주소를 썼었다.
- url의 dtd는 뭐냐면 현재 이 xml 문서 내의 프로퍼티스 관련된 태그들만 작성했는지 내부적으로 유효성 체크를 해준다고 했었다.
혹시라도 유효하지 않은 태그가 작성되었다면 빨간줄로 오류를 알려준다.
- 그리고 전체 감싸는 태그로 <properties> 태그여야 한다고 했었다.
제일 루트 엘리먼트가 <properties> </properties> 였었다.
- 그리고 이 <properties> </properties>태그 안에 여러 entry들을 key=value 형식으로 작성해서 쿼리를 작성했었다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<!-- 주석 -->
<entry key="">
</entry>
</properties>
ㅁ vo 클래스
- src/main/java의 com.br.~.member.model.vo 패키지에 Member 클래스를 만든다.
- sql developer에서 해당 테이블의 컬럼들을 따서 필드를 만든다.
- 기본생성자, 매개변수 생성자, 게터세터, toString 메소드를 만든다.
( alt shift s - o - 엔터, alt shift s - r - alt a - alt r, alt shif s - s - 엔터 )
- Date는 import할때 java.sql의 클래스를 import 해야 한다. 그래야 db로부터 조회된 DATE 컬럼의 값을 담을 수 있다.
- int와 Date형 필드 말고는 다 String형 필드들이다.
ㅁ service, dao
- src/main/java의 com.br.~.member.model.service 패키지에 MemberService 클래스를 만든다.
- src/main/java의 com.br.~.member.model.dao 패키지에 MemberDao 클래스를 만든다.
- MemberDao에 전역 변수로 private Properties prop = new Properties();를 둔다.
- MemberDao 객체가 생성될 때 기본 생성자가 실행되므로,
기본 생성자에 xml파일을 읽어들여서 프로퍼티스 객체 변수에 담기게 하는 구문을 작성한다.
- 기본생성자에서 쿼리문이 작성되어 있는 member-mapper.xml 파일을 읽어들여야 한다.
여기서도 JDBCTemplate.java에서 했던 것처럼 똑같이 getResource() 메소드와 getPath() 메소드를 사용한다.
- dao 패키지에서도 src/main/java/db.mappers 패키지 안에 있는 member-mapper.xml 파일이 아니라,
webApp/src/main/webapp/WEB-INF/classes/db/mappers 폴더의 member-mapper.xml 파일을 불러와야 한다.
ㅁ 앞으로 url 요청시 context path는 언제든지 변경될 수 있기 때문에
현재 context path를 동적으로 알아내는 request.getContextPath() 메소드를 사용해야 한다.
- header.jsp에 <% String contextPath=request.getContextPath(); %>로 담아놓을 수 있다.
ㅁ 어떤 페이지에 있든 로고 이미지를 클릭하면 메인 페이지로 올 수 있게끔 하려면,
a 태그에 href로 요청할 url을 context path로 작성하면 된다.
<a href="<%=contextPath%>">
- context path로 작성하면, "/web"이 오고, 이러면 index.jsp 페이지가 로드된다.
- 앞으로 요청 처리 이후에 index.jsp 페이지가 띄워지게끔 하려면 url로 위와 같이 context path를 요청하면 된다.
ㅁ 아이디와 비밀번호 텍스트상자에 입력된 값을 로그인 요청시 서버에 전송시켜야 한다.
- 웹과 통신을 할 때는 항상 key-value 세트로 데이터가 움직인다.
- key 값을 부여해야 value 값이 넘어가므로 input 요소에 name 속성도 추가한다.
ㅁ 화면(jsp)
- 비밀번호가 노출되면 안되므로 이런 보안을 중시하는 요청은 post 방식으로 요청한다.
method="post"로 하면 데이터가 url에 노출되지 않는다.
- 요청할 url은 action=""에 작성하면 된다. 항상 서블릿을 요청한다고 보면 된다.
단순한 페이지 요청도 다 서블릿으로 요청한다.
- 서블릿의 url mapping 값을 context path 뒤에 작성한다.
항상 절대경로 방식으로 요청할 url을 작성하는 것이 좋다.
- 회원서비스는 url mapping값의 패턴을 항상 뒤에 ".me"로 끝나게 작성하기로 한다.
서비스별로 url 패턴을 구분지어주는 것이 좋다.
보통 . 하고 뒤에 패턴을 붙인다.
- <form action="<%= contextPath %>/login.me" method="post">
/login.me 라는 url mapping 값을 가지는 서블릿을 호출하기로 한다.
ㅁ controller (서블릿)
- com.br.web.member.controller에 "/login.me"라는 url mapping 값을 가지는 서블릿 클래스를 만든다. (슬래시 필수)
- 서블릿 클래스는 MVC 패턴 중 컨트롤러 역할이다.
- src/main/java의 com.br.web.member.controller 패키지 우클릭 - new - Servlet으로 서블릿을 만든다.
- 서블릿 클래스명의 시작은 대문자로 작성한다.
파일들이 많은데 어떤게 클래스고 어떤게 jsp 파일인지 구분할 수 있어야 한다.
jsp 파일명은 소문자로 시작하게 작성한다.
- header.jsp의 로그인 form에서 로그인 요청시, "/login.me"라는 url이 요청되고,
그때 실행되는 서블릿 클래스가 MemberLoginController이다.
- controller 클래스에서 service => dao로 데이터를 넘겨서 db에 쿼리문을 실행하고 결과를 돌려받는다.
- doPost() 메소드에서 doGet() 메소드를 호출하고 있다.
이클립스에서는 개발자 편의를 위해서 get 방식이든 post 방식이든 doGet() 메소드에서 작업할 수 있게 해놨다.
- doPost() 메소드에 작성된 구문은 그대로 두고,
doGet() 메소드에 작성된 구문을 다 지우고 post 방식임에도 그냥 doGet() 메소드에 작성한다.
- 컨트롤러에서는 항상 두 가지만 기억하면 된다.
요청에 관한 것과 응답에 관한 것을 작성하면 된다.
- 요청에 관한 것은 요청하면서 전달한 값을 뽑아내고, JDBC 과정을 통해서 쿼리를 실행 후 결과를 받으면 된다.
요청에 전달값이 없다면 굳이 값을 뽑을 필요 없다.
만약 단순한 페이지 이동이라면 그때는 쿼리 실행할 것도 없다.
- post 방식 요청일 경우, 한글 데이터면 setCharacterEncoding("UTF-8") 메소드를 이용해서 utf-8로 인코딩 해야 한다.
'05_Server (04. JSP 프로그래밍 구현)' 카테고리의 다른 글
[EL&JSTL] EL (2) | 2024.10.07 |
---|---|
[AJAX] 1. ajax를 이용한 비동기식 요청 (0) | 2024.09.29 |
JSP/SERVLET 정리 (2) | 2024.09.21 |
X [4-3] 사진게시판서비스 상세조회요청(슬라이드이미지) (0) | 2024.09.11 |
X [4-2] 사진게시판서비스 목록조회요청(썸네일형식) (0) | 2024.09.11 |