오늘의 노래 추천 😈
- 아티스트
- STAYC(스테이씨)
- 앨범
- WE NEED LOVE
- 발매일
- 1970.01.01
beautiful monster 들을 때가 된것같아요 다들
DAY 7
ㅡ Maven ㅡ
Build의 자동관리 도구 maven
Build 란?
ㅡ> project에서 사용된 여러 소스코드 등을 실행가능한 독립적 소프트웨어 산출물로 바꿔주는 과정
프로젝트가 완성되면 코드 파일을 WAR, JAR 등 실행가능한 압축파일로 만드는 과정
maven 은 pom.xml 설정파일을 이용해 라이브러리를 자동 다운로드함
표준화된 포멧으로 협업이 유리하고 다양한 plug in으로 작업 자동화
" Graddle 이 뜨는 추세니까 따로 찾아보길 추천 "
ㅡ Dynamic Web Project ㅡ> Maven convertㅡ
Maven convert
Dynamic Web Project 를 Maven Project 로 convert
ㅡ> pom.xml 파일 생성됨
ㅡ MVC 패턴을 이용한 회원관리 시스템 실습 ( Maven Project ) ㅡ
MVC, JDBC, Maven
pom.xml 에 ojdbc 라이브러리를 넣어주기위해 dependencies 태그 생성
ojdbc8 의 dependency 태그를 불러오기 위해 maven repository 사이트 접속
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>
ojdbc8 dependency 내용을 dependencies 태그 내 추가하면 libraries에 생성됨
ㅡ main.jsp 파일 생성 ㅡ
main.jsp
<body>
<h1>main page</h1>
<ul>
<li><a href="join.jsp">JOIN</a></li>
<li><a href="login.jsp">LOGIN</a></li>
</ul>
</body>
ㅡ join.jsp 파일 생성 ㅡ
join.jsp
<body>
<!-- 회원 가입 : 사용자의 정보를 입력받아 DB에 저장 >> DB에 Table이 있어야함 -->
<form action=joinService.jsp method="post">
ID : <input type="text" name="id" placeholder="아이디를 입력하세요"><br>
PW : <input type="password" name="pw" placeholder="비밀번호를 입력하세요"><br>
Nick : <input type="text" name="nick" placeholder="닉네임을 입력하세요"><br>
<button type="submit">JOIN</button>
</form>
</body>
http 라는 프로토콜에서 client가 요청을 보내는 것으로 기능이 시작됨
ㅡ joinService.jsp 파일 생성 ㅡ
<사용자 (join)요청 처리 단계>
1. 데이터 수집 (parameter 수집)
2. DB에 정보 저장 (JDBC)
3. 페이지 이동 (후 화면 구현)
<body>
<%
// 사용자 요청(request) 처리 단계
// 1. 데이터 수집(parameter 수집)
// 입력값을 가지고 있는 객체가 request이기 때문에 request를 인코딩
request.setCharacterEncoding("UTF-8");
// 사용자의 요청를 가진 request의 getParameter 메서드 사용 후 변수 저장
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String nick = request.getParameter("nick");
// 2. 기능 실행
// DB에 정보 저장 (JDBC 활용)
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
int cnt = 0;
try { // 1. driver 동적로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2. DB 연결
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "hr";
String password = "12345";
conn = DriverManager.getConnection(url, user, password);
if (conn != null) {
System.out.println("연결성공");
} else {
System.out.println("연결실패");
}
// 3. sql Query문 작성
// MEMBER2 테이블에 값 추가를 위해 insert into ~ values 사용
String sql = "INSERT INTO MEMBER2 VALUES(?,?,?)";
// prepareStatement 준비된 상태
psmt = conn.prepareStatement(sql);
// ? 인자 채워주기 (데이터 바인딩)
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, nick);
// 4. sql 문 실행
// executeQuery 는 Resultset이 리턴타입
// executeUpdate 는 int가 리턴타입
cnt = psmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try { // 사용한 객체 닫기
if (rs!=null) rs.close();
if (psmt!=null) psmt.close();
if (conn!=null) conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
// 실행 결과가 정상적인지 확인(cnt)
if (cnt>0) {
System.out.print("회원가입을 환영합니다");
} else {
System.out.print("회원가입에 실패하였습니다");
}
// 3. 페이지 이동(후 화면 구현)
response.sendRedirect("main.jsp");
%>
</body>
여기까지 기본적인 회원가입을 위한 JDBC 코드를 jsp 파일에 구현완료
Model : 데이터를 다루기 위해 만든 도구/클래스, 혼자서 실행 X (java)
View : 사용자의 눈에 보여지는 페이지 (html, jsp)Controller : 요청을 받았을 때, 특정 기능을 실행하는 주체 (Servlet)
ㅡ> MVC 패턴을 이용해
ㅡ MVC 구성을 위한 controller 패키지 생성 ㅡ
group id = 도메인명.회사명(팀명) = com.smhrd
artifact id = controller
group id + artifact id ==> 패키지 명 생성
ㅡ JoinController 클래스 생성 ㅡ
JoinController 클래스에 joinService 내의 코드를 복붙해줌
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 사용자 요청(request) 처리 단계
// 1. 데이터 수집(parameter 수집)
// 입력값을 가지고 있는 객체가 request이기 때문에 request를 인코딩
request.setCharacterEncoding("UTF-8");
// 사용자의 요청를 가진 request의 getParameter 메서드 사용 후 변수 저장
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String nick = request.getParameter("nick");
// 2. 기능 실행
// DB에 정보 저장 (JDBC 활용)
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
int cnt = 0;
try { // 1. driver 동적로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2. DB 연결
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "hr";
String password = "12345";
conn = DriverManager.getConnection(url, user, password);
if (conn != null) {
System.out.println("연결성공");
} else {
System.out.println("연결실패");
}
// 3. sql Query문 작성
// MEMBER2 테이블에 값 추가를 위해 insert into ~ values 사용
String sql = "INSERT INTO MEMBER2 VALUES(?,?,?)";
// prepareStatement 준비된 상태
psmt = conn.prepareStatement(sql);
// ? 인자 채워주기 (데이터 바인딩)
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, nick);
// 4. sql 문 실행
// executeQuery 는 Resultset이 리턴타입
// executeUpdate 는 int가 리턴타입
cnt = psmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try { // 사용한 객체 닫기
if (rs != null)
rs.close();
if (psmt != null)
psmt.close();
if (conn != null)
conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
// 실행 결과가 정상적인지 확인(cnt)
if (cnt > 0) {
System.out.print("회원가입을 환영합니다");
} else {
System.out.print("회원가입에 실패하였습니다");
}
// 3. 페이지 이동(후 화면 구현)
response.sendRedirect("main.jsp");
}
url mapping은 "Join" 으로 ( join.jsp의 form 태그 action도 변경해줘야함 )
ㅡ MVC 구성을 위한 model 패키지 생성 ㅡ
group id = 도메인명.회사명(팀명) = com.smhrd
artifact id = model
group id + artifact id ==> 패키지 명 생성
ㅡ MemberDAO 클래스 생성 ㅡ
DB에 접근해 상호작용하는 method를 정의하는 클래스
JoinController 의 JDBC 코드를 복붙 ㅡ> join 메서드 생성
* join 메서드는 sql 문 실행을 위해 id, pw, nick 변수를 파라미터로 받아줘야함
** join 메서드는 sql 문 실행 결과를 리턴함 (리턴타입 int)
// DAO (Data Access Object)
// DB에 접근해 상호작용을 하는 기능(method)을 정의하는 클래스
// SQL문을 실행시키기 위해 필요한 데이터를 매개변수로 받아옴
// SQL문 실행 결과를 리턴함
// 분업 및 비슷한 기능끼리 모아놓기 위함 >> 유지보수 용이, 중복 차단
// 1. 회원가입(join 메서드)
public int join(String id, String pw, String nick) {
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
int cnt = 0;
try { // 1. driver 동적로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2. DB 연결
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "hr";
String password = "12345";
conn = DriverManager.getConnection(url, user, password);
if (conn != null) {
System.out.println("연결성공");
} else {
System.out.println("연결실패");
}
// 3. sql Query문 작성
// MEMBER2 테이블에 값 추가를 위해 insert into ~ values 사용
String sql = "INSERT INTO MEMBER2 VALUES(?,?,?)";
// prepareStatement 준비된 상태
psmt = conn.prepareStatement(sql);
// ? 인자 채워주기 (데이터 바인딩)
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, nick);
// 4. sql 문 실행
// executeQuery 는 Resultset이 리턴타입
// executeUpdate 는 int가 리턴타입
cnt = psmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try { // 사용한 객체 닫기
if (rs != null)
rs.close();
if (psmt != null)
psmt.close();
if (conn != null)
conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
// SQL문 실행결과 리턴
return cnt;
}
ㅡ JoinController 클래스 수정 ㅡ
클래스 내 JDBC 코드를 지우고 MemberDAO 객체 생성 후 join 메서드 호출
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 사용자 요청(request) 처리 단계
// 1. 데이터 수집(parameter 수집)
// 입력값을 가지고 있는 객체가 request이기 때문에 request를 인코딩
request.setCharacterEncoding("UTF-8");
// 사용자의 요청를 가진 request의 getParameter 메서드 사용 후 변수 저장
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String nick = request.getParameter("nick");
// 2. 기능 실행
// DB에 정보 저장 (JDBC 활용)
MemberDAO dao = new MemberDAO();
int cnt = dao.join(id, pw, nick);
// 실행 결과가 정상적인지 확인(cnt)
if (cnt > 0) {
System.out.print("회원가입을 환영합니다");
} else {
System.out.print("회원가입에 실패하였습니다");
}
// 3. 페이지 이동(후 화면 구현)
response.sendRedirect("main.jsp");
}
ㅡ MemberDAO 클래스 내 중복 제거 ㅡ
중복 변수는 field 영역으로, 중복 코드는 새로운 메서드로 정의
* throws Exception : 메서드 내 오류를 반드시 오류 처리하는 구문 ( try/catch 구문을 강제함 )
// 중복 변수 필드 영역으로 이동
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
int cnt = 0;
public void getConn() throws Exception {
try { // driver 동적로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
// DB 연결
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "hr";
String password = "12345";
conn = DriverManager.getConnection(url, user, password);
if (conn != null) {
System.out.println("연결성공");
} else {
System.out.println("연결실패");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void close() {
try { // 사용한 객체 자원 반납
if (rs != null)
rs.close();
if (psmt != null)
psmt.close();
if (conn != null)
conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
// 1. 회원가입
public int join(String id, String pw, String nick) {
try {
getConn(); // DB 연결
// MEMBER2 테이블에 값 추가를 위해 insert into ~ values 사용
String sql = "INSERT INTO MEMBER2 VALUES(?,?,?)";
psmt = conn.prepareStatement(sql);
// ? 인자 채워주기 (데이터 바인딩)
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, nick);
// 4. sql문 실행
cnt = psmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 자원 반납
close();
}
// SQL문 실행결과 리턴
return cnt;
}
ㅡ main.jsp 실행 ㅡ
여기까지 JoinController와 MemberDAO 클래스 작성 완료
ㅡ MemberDTO 클래스 생성 ㅡ
* 데이터 변형방지를 위해 필드 값을 private로 선언필드의 변수값을 각각 초기화 해주는 생성자
ㅡ> DTO 는 데이터 값을 이동할 때 잠깐 담아줄 수 있는 "바구니"라고 생각하면 편함
// DTO (Data Transfer Object)
// 계층간(서로 다른 파일) 데이터를 주고받을 때, 담아 보낼 수 있는 바구니
// 데이터를 클래스의 필드에 저장하고 담고 빼는 기능
// 1. 테이블과 같은 모양으로 설계(테이블 당 DTO 한 개씩)
// 같은 모양 >> 테이블이 있는 컬럼명 == 필드 이름
// ㅡ> 자료형이 일치되도록 필드 선언
// 2. 데이터가 쉽게 변형되지 않게끔 private 로 필드 선언
// 3. Getter/Setter 가 존재해야함 (alt+shift+s)
// 4. 기본 생성자가 있어야함
// >> 유연성
// >> MyBatis 와 같은 라이브러리에서 기본 생성자 요구
private String id;
private String pw;
private String nick;
public MemberDTO() {} // 기본 생성자 : 객체 생성 역할
public MemberDTO(String id, String pw, String nick) {
super();
this.id = id;
this.pw = pw;
this.nick = nick;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
ㅡ MemberDAO, JoinConTroller 클래스 수정 ㅡ
MemberDAO 의 join 메서드가 받는 파라미터를 MemberDTO 타입의 dto 변수로 수정
JoinConTroller 의 request 요청값 저장 변수는 dto의 setter 메서드로 필드값 초기화
MemberDAO 에서는 dto 의 getter 메서드로 값 불러오기
// DTO에 담아두기
MemberDTO dto = new MemberDTO();
dto.setId(id);
dto.setPw(pw);
dto.setNick(nick);
// 2. 기능 실행
// DB에 정보 저장 (JDBC 활용)
MemberDAO dao = new MemberDAO();
int cnt = dao.join(dto);
public int join(MemberDTO dto) {
try {
getConn(); // DB 연결
// MEMBER2 테이블에 값 추가를 위해 insert into ~ values 사용
String sql = "INSERT INTO MEMBER2 VALUES(?,?,?)";
psmt = conn.prepareStatement(sql);
// ? 인자 채워주기 (데이터 바인딩)
psmt.setString(1, dto.getId());
psmt.setString(2, dto.getPw());
psmt.setString(3, dto.getNick());
같은 방식으로 login 메서드 추가하기
ㅡ login.jsp 파일 생성 ㅡ
login.jsp
<body>
<form action="Login" method="post">
ID : <input type="text" name="id" placeholder="아이디를 입력하세요"><br>
PW : <input type="password" name="pw" placeholder="비밀번호를 입력하세요"><br>
<button type="submit">LOGIN</button>
</form>
</body>
ㅡ MemberDAO 에서 login 메서드 생성 ㅡ
select 쿼리문을 사용해 로그인 메서드 작성
dto 를 파라미터로 받고 sql문 실행 후 MemberDTO 타입의 데이터를 리턴함
// 2. 로그인
public MemberDTO login(MemberDTO dto) {
MemberDTO result=null;
try {
getConn(); // DB 연결
// MEMBER2 테이블에서 id, pw가 일치하는 사용자가 있는지 조회
String sql = "select * from MEMBER2 where id=? and pw=?";
psmt = conn.prepareStatement(sql);
// ? 인자 채워주기 (데이터 바인딩)
psmt.setString(1, dto.getId());
psmt.setString(2, dto.getPw());
// 4. sql문 실행
rs = psmt.executeQuery();
// rs의 데이터를 옮겨담기(리턴값을 위함)
if(rs.next()) {
String id = rs.getString(1);
String pw = rs.getString(2);
String nick = rs.getString(3);
// 리턴하기 위해 id, pw, nick 을 MemberDTO 타입의 변수에 저장
result = new MemberDTO(id, pw, nick);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 자원 반납
close();
}
// SQL문 실행결과 리턴
return result;
}
ㅡ LoginController 클래스생성 ㅡ
dto를 파라미터로 받는 login 메서드의 리턴값이 MemebrDTO 타입이므로 MemberDTO 타입의 변수에 리턴값 저장
ㅡ> MemberDAO 의 login 메서드 리턴값이 null 인지 아닌지에 따라 로그인 성공 여부 결정
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 파라미터 수집
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
MemberDTO dto = new MemberDTO();
dto.setId(id);
dto.setPw(pw);
// 2. 기능 실행
// id, pw로 DB를 조회
MemberDAO dao = new MemberDAO();
MemberDTO result = dao.login(dto);
// 3. 페이지 이동
if(result!=null) { // 로그인 성공
System.out.println("로그인 성공");
response.sendRedirect("main.jsp");
}else if(result==null){ // 로그인 실패
System.out.println("로그인 실패");
response.sendRedirect("login.jsp");
}
}
회원가입, 로그인 결과에 따라 main 페이지 변경하기 (session 이용)
ㅡ> 로그인 성공 시, login 메서드 리턴값을 세션에 저장
// 3. 페이지 이동(로그인 결과에 따라 main 페이지 변경)
if(result!=null) { // 로그인 성공
System.out.println("로그인 성공");
HttpSession session = request.getSession();
session.setAttribute("user", result);
response.sendRedirect("main.jsp");
}else if(result==null){ // 로그인 실패
System.out.println("로그인 실패");
response.sendRedirect("login.jsp");
}
ㅡ main.jsp 파일 수정 ㅡ
로그인 성공 시 저장한 session값을 불러오고 session 값이 null 인지 여부 판단
<body>
<%
// session에 저장된 사용자 정보 꺼내기
// session에서 데이터를 꺼낼때는 down casting(형변환)
MemberDTO user = (MemberDTO)session.getAttribute("user");
%>
<h1>main page</h1>
<ul>
<% if(user==null) { %>
<li><a href="join.jsp">JOIN</a></li>
<li><a href="login.jsp">LOGIN</a></li>
<% }else{ %>
<li><a href="">개인정보 수정</a></li>
<li><a href="">회원 탈퇴</a></li>
<li><a href="">로그아웃</a></li>
<% } %>
</ul>
</body>
로그인 성공 시 개인정보 수정, 회원 탈퇴, 로그아웃 기능 추가
ㅡ update.jsp 파일 생성 ㅡ
로그인 성공 후 session 에 저장된 사용자 정보 불러오기 (MemberDTO 타입)
input 태그에 value 속성을 이용해 사용자 정보 띄워주기
* 수정이 불가한 id 는 readonly 속성 추가
<body>
<%
MemberDTO user = (MemberDTO)session.getAttribute("user");
%>
<form action="update" method="post">
ID : <input readonly value="<%=user.getId()%>" type="text" name="id"><br>
PW : <input value="<%=user.getPw()%>" type="password" name="pw"><br>
Nick : <input value="<%=user.getNick()%>" type="text" name="nick"><br>
<button type="submit">UPDATE</button>
</form>
</body>
ㅡ MemberDAO 에서 update메서드 생성 ㅡ
dto와 user를 파라미터로 받는 update 메서드 작성
dto에는 수정된 정보가 저장되어있고, user 는 session 에 저장된 사용자 정보
ㅡ> 쿼리문 update set 에서는 사용자가 입력한 수정값인 dto에서 get
사용자를 식별할 wherer 조건에서는 session에 저장된 user 에서 get
// 3. 회원정보 수정
public int update(MemberDTO dto, MemberDTO user) {
MemberDTO result = null;
try {
getConn(); // DB 연결
// MEMBER2 테이블에서 user id, pw가 일치하는 사용자의 정보를 update
String sql = "update member2 set pw=?, nick=? where id=? and pw=?";
psmt = conn.prepareStatement(sql);
// ? 인자 채워주기 (데이터 바인딩)
// update set 에는 사용자가 입력한 수정값인 dto에서 get
// where 조건에서는 session에 저장된 원래 사용자 정보인 user에서 get
psmt.setString(1, dto.getPw());
psmt.setString(2, dto.getNick());
psmt.setString(3, user.getId());
psmt.setString(4, user.getPw());
// 4. sql문 실행
cnt = psmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 자원 반납
close();
}
// SQL문 실행결과 리턴
return cnt;
}
ㅡ UpdateController 클래스 생성 ㅡ
리턴값이 int 인 update 메서드의 리턴값에 따라 수정 실패 성공 여부 판단
ㅡ> update 성공 시 session 정보를 수정값인 dto로 setAttribute
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 파라미터 로딩
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String nick = request.getParameter("nick");
MemberDTO dto = new MemberDTO(id, pw, nick);
// 세션에 저장된 user 정보 getAttribute로 user 변수 저장
HttpSession session = request.getSession();
MemberDTO user = (MemberDTO)session.getAttribute("user");
// 2. 기능 실행
MemberDAO dao = new MemberDAO();
int cnt = dao.update(dto, user);
// 3. 페이지 이동(수정 결과에 따라 main 페이지 변경)
if (cnt>0) { // update 성공
System.out.println("수정 성공");
// update 성공할 경우 session 정보를 수정값으로 setAttribute
session.setAttribute("user", dto);
response.sendRedirect("main.jsp");
} else { // update 실패
System.out.println("수정 실패");
response.sendRedirect("update.jsp");
}
}
(수정중)

BYE