Notice
Recent Posts
Recent Comments
Links
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Today
In Total
관리 메뉴

A Joyful AI Research Journey🌳😊

[63] 230329 Spring: 회원 관리 페이지 만들기 [K-디지털 트레이닝 63일] 본문

🌳Bootcamp Revision✨/Spring Framework, Java

[63] 230329 Spring: 회원 관리 페이지 만들기 [K-디지털 트레이닝 63일]

yjyuwisely 2023. 3. 29. 12:46

230329 Wed 63rd class

Ch. 18 MVC 패턴 구현
진도: Ch. 18 MVC 패턴 구현에 기반한 자체 수업 (교재: 최범균의 JSP 2.3 웹 프로그래밍: 기초부터 중급까지, 저자: 최범균)
책 예제 코드: https://github.com/madvirus/jsp23
저자 블로그: https://javacan.tistory.com/

 

최범균의 JSP 2.3 웹 프로그래밍: 기초부터 중급까지 | 최범균 - 교보문고

최범균의 JSP 2.3 웹 프로그래밍: 기초부터 중급까지 | [최범균의 JSP 2.3 웹 프로그래밍 기초부터 중급까지]는 JSP 2.3의 새로운 특징 반영과 JSP를 지원하는 요소인 서블릿과 표현 언어 등의 새로운

product.kyobobook.co.kr


오늘 배운 것 중 기억할 것을 정리했다.


앞에서 배운 것

Presentation    Business    Persistence tier   DB
SpringMVC <---------------> Spring Core  <---------------> MyBatis <------------>  
  <-------------------------------------------------------------------------------------------------------------  
MemberController.
java
  LoginService.
java 
  LoginMapper
from
LoginServiceImpl.
java
   
메서드
member();
memberPost();
--------------->
member
데이터를 넘긴다.
ls

메서드

memreg();
login();
--------------->
member
데이터를 넘긴다.
lm

메서드

memreg();
login();
   

데이터의 흐름

login.jsp: 데이터 

-> MemberController.javamember -> member

-> LoginService.java의 member

-> LoginServiceImpl.java의 member from public LoginVO login (LoginVO member) -> return lm.login(member)


-> LoginMapper.java의 member from public LoginVO login(LoginVO member);


-> LoginMapper.xml의 <select> #{id}, #{password}가 일치해야한다.

그 후 MySql의 DB에 저장된다.


회원 관리 페이지 만들기

회원을 관리하는 화면 (관리자용)
http://localhost:8081/list

id name
이름
birthday
생일
gender
성별
email
이메일
phone
폰번호
           

어떤 화면을 만들건지 생각해보고, 주소를 생각해보고, 컨트롤러를 만들고, 폴더명 만들고 리턴한다.
폴더명 없으면 JSP 파일 이름으로 리턴한다. 

화면에서 던질 게 없으면 매개 변수 비워둔다. 


코드) MemberController.java 일부

@Controller
public class MemberController {
@Autowired
LoginService ls; //LoginService ls = new LoginService(); 클래스를 new를 써서 객체화한 것.
// 회원관리페이지
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String mergerlist() { //처음 에러 메시지: 리턴이 있어야 한다.
return "member/list"; //member폴더의 list.jsp 만들어준다.
}
}

실행되자마자 select 해야 한다. 두 화면으로 나눌 필요가 없고 (ex. 로그인, 로그인 서버, 회원 가입, 회원 가입 서버 코드)
바로 DB 연결한다. 
(앞에서 한 버튼 클릭 후 DB연결과는 다르다.)

폰번호는 int로 하면 앞의 0이 사라지므로 varchar로 한다.


ArrayList
동적인 배열이다. (길이가 왔다갔다한다.)
정수 값만 들어갈 수 있다.

ArrayList<Integer> score = new ArrayList<>();
score 10 20 30 40 50 60 70



정식 명칭: 제네릭 타입

ArrayList<LoginVO> score = new ArrayList<>();


제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.
참고: https://st-lab.tistory.com/153

MySQL에 있는 각각의 행이 저장된다.
LoginVO 타입이 저장된다.

public class LoginVO {

private String id; //aaaa
private String password; //1234
private String addr;
private String phone; //2023-03-29
private String email;
private String name; //정자바
private int age;
} //없는 것은 null값이 들어간다.
public class LoginVO {

private String id;
private String password;
private String addr;
private String phone;
private String email;
private String name;
private int age;
}
public class LoginVO {

private String id;
private String password;
private String addr;
private String phone;
private String email;
private String name;
private int age;
}
score[0] score[1] (각각 다른 값) score[2] (각각 다른 값) ...
쭉 나감  score[n]

리턴해서 가져간다.


데이터의 흐름

흐름 순서는 좌측 상단, 그 아래, 중간, 그 아래, 우측 상단, 그 아래 순서이다.
처음에 오류가 났었는데 아래 파일에 LoginVO 타입로 설정을 안 해서 그렇다.
LoginService.java

LoginServiceImpl.java

LoginMapper.java

[1] list.jsp: 데이터
(board/list.jsp : 게시판 목록이며, member/list.jsp : 회원 목록으로 다르다.) 

컨트롤러의 데이터를 .jsp로 보낼 때 아래와 같은 방식으로 모델을 쓴다.
코드) BoardController.java

// 게시판 상세 페이지
@RequestMapping(value = "/board/detail", method = RequestMethod.GET)
// public String detail(int bno){
public String detail (BoardVO board, Model model) {
System.out.println(board);
// bs.detail(bno);
model.addAttribute("detail", bs.detail(board));
return "board/detail";
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 관리 페이지</title>
</head>
<body>
${memlist}
<table border="1">
<tr>
<td>ID</td><td>비밀번호</td><td>주소</td><td>폰번호</td><td>이메일</td><td>이름</td><td>생일</td>
</tr>
<c:forEach items="${memlist}" var="list">
<tr>
<td>${list.id}</td>
<td>${list.password}</td>
<td>${list.addr}</td>
<td>${list.phone}</td>
<td>${list.email}</td>
<td>${list.name}</td>
<td>${list.age}</td>
</tr>
</c:forEach> <!-- 반복한다. -->
</table>
</body>
</html>


[2] MemberController.javamember -> member

package org.hj.controller;
import javax.servlet.http.HttpSession;
import org.hj.model.LoginVO; //모델(LoginVO)이 있음을 알려준다.
import org.hj.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MemberController {
@Autowired
LoginService ls; //LoginService ls = new LoginService(); 클래스를 new를 써서 객체화한 것.
//LoginService는 인터페이스이므로 원래 new는 안 되는 데 위에 @AutoWired 이용해서 가능하게 했다.
// 회원가입 //화면 실행을 위한 멤버 (GET방식)
@RequestMapping(value = "/member", method = RequestMethod.GET) //member 메서드 GET 방식
public String member () {
return "member/memberin"; //멤버 폴더의 memberin.jsp를 실행한다.
}
// 회원가입서버 //실제로 가입하기 위한 멤버 (POST방식)
@RequestMapping(value = "/member", method = RequestMethod.POST) //둘 다 GET이면 충돌이 일어난다. 메서드 방식이 POST이다.
// int a //member는 참조 변수
//public String memberPost(String id, String password, String name) //메모리 차지가 크므로 쓰지 않는 방법이다. private 같은 접근 제한자도 없다.
public String memberPost (LoginVO member) { // 모델: LoginVO
System.out.println(member); //member.toString()이 생략된 것이다.
//#####새로 추가함#####
ls.memreg(member);
return "board/list"; //board 폴더의 list.jsp를 실행한다. 게시판 목록을 보여준다.
}
// 로그인 페이지
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login () {
System.out.println("aaaa");
return "member/login";
}
// 로그인 서버
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String loginPost (HttpSession session, LoginVO member) { //member: login.jsp의 데이터를 가져온다.
// HttpSession session = new HttpSession; 위 ()안의 HttpSession session을 지우고 대신 사용 가능하다.
/* System.out.println("contorller="+member);
System.out.println(ls.login(member));*/
session.setAttribute("login", ls.login(member)); //위 member의 아이디, 비밀번호를 가져간다.
if (ls.login(member)==null) {
return "member/login";
} else {
session.setAttribute("login", ls.login(member)); //null이 아니면 세션에 저장한다.
return "redirect:/list";
//위는 주소 정의해준 게 없어서 처음에 에러남 (board의 list.jsp로 가는 게 아닌 듯 -> member 폴더의 list.jsp 따로 만들어야한다.)
//return "/board/list"; //게시판 리스트 보기 위해 내가 아래 코드로 바꿈.
}
}
// 회원관리페이지
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String mergerlist(Model model) { //처음 에러 메시지: 리턴이 있어야 한다.
//model.addAttribute(String name, Object value);
//: value 객체를 name 이름으로 추가함. 뷰 코드에서는 name으로 지정한 이름을 통해서 value를 사용함.
model.addAttribute("memlist", ls.memlist()); //ls.memlist()->memlist:데이터 저장해서 넘긴다.
return "member/list"; //member폴더의 list.jsp 만들어준다.
}
// 회원정보수정 및 삭제
}



[3] LoginService.java의 member

public void memlist(); //비워둔다.
package org.hj.service;
import java.util.ArrayList;
import org.hj.model.LoginVO;
//설계한다.
public interface LoginService { //인터페이스가 new()를 할 수 없으므로 MemberController.java에 @Autowired를 설정
//#####새로 추가함#####
public void memreg(LoginVO member); //추상메서드이므로 LoginServiceImpl.java에서 구현한다.
public LoginVO login(LoginVO member);
public ArrayList<LoginVO> memlist(); //비워둔다.
}



[4] LoginServiceImpl.java의 member from public LoginVO login (LoginVO member) -> return lm.login(member)

LoginServiceImpl.java
public void memlist() {
lm.memlist();
}

위의 코드가 아래 MemberController.javals.memlist();로 간다.

// 회원관리페이지
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String mergerlist() { //처음 에러 메시지: 리턴이 있어야 한다.
ls.memlist();
return "member/list"; //member폴더의 list.jsp 만들어준다.
}
package org.hj.service;
import java.util.ArrayList;
import org.hj.mapper.LoginMapper;
import org.hj.model.LoginVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
//구현한다.
@Service
public class LoginServiceImpl implements LoginService {
@Autowired
LoginMapper lm;
//#####새로 추가함#####
public void memreg(LoginVO member) { //추상메서드 LoginSerive.java를 구현한다.
lm.memreg(member);
};
public LoginVO login (LoginVO member) {
System.out.println("service="+member);
System.out.println("service return="+lm.login(member));
return lm.login(member);
}
//비즈니스까지 끝났다. 서비스 -> DB 연결해야한다.
public ArrayList<LoginVO> memlist() {
return lm.memlist();
}
}



[5] LoginMapper.java의 member from public LoginVO login(LoginVO member);

package org.hj.mapper;
import java.util.ArrayList;
import org.hj.model.LoginVO;
public interface LoginMapper {
//#####새로 추가함#####
public void memreg(LoginVO member);
public LoginVO login(LoginVO member);
public ArrayList<LoginVO> memlist();
}



[6] LoginMapper.xml의 <select> #{id}, #{password}가 일치해야한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.hj.mapper.LoginMapper">
<!-- #####새로 추가함##### -->
<insert id="memreg"> <!-- LoginMapper.java의 memreg를 연결한다. insert태그를 사용한다.-->
insert into member (id, password, name, birthday, gender)
values(#{id},#{password},#{name},sysdate(),"f");
</insert>
<select id="login" resultType="org.hj.model.LoginVO"> <!-- 구현메서드가 없으니까 return이 없다. -->
<!-- 대신 select는 resultType이라는 타입이 return 역할이다. -->
select id, password <!-- 결과는 한 건이다. id는 기본키이다. -->
from member
where id=#{id} and password=#{password}
</select>
<!-- 회원 관리 리스트 페이지 -->
<select id="memlist" resultType="org.hj.model.LoginVO">
select * from member <!-- 결과는 여러 건이다. LoginVO타입의 배열이 필요하다!-->
</select>
</mapper>



그 후 MySql의 DB에 저장된다.

결과)


728x90
반응형
Comments