일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Absolute
- AGI
- ai
- AI agents
- AI engineer
- AI researcher
- ajax
- algorithm
- Algorithms
- aliases
- Array 객체
- ASI
- bayes' theorem
- Bit
- Blur
- BOM
- bootstrap
- canva
- challenges
- ChatGPT
- Today
- In Total
A Joyful AI Research Journey🌳😊
[63] 230329 Spring: 회원 관리 페이지 만들기 [K-디지털 트레이닝 63일] 본문
[63] 230329 Spring: 회원 관리 페이지 만들기 [K-디지털 트레이닝 63일]
yjyuwisely 2023. 3. 29. 12:46230329 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.java: member -> 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.java: member -> 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.java의 ls.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에 저장된다.
결과)

'🌳Bootcamp Revision✨ > Spring Framework, Java' 카테고리의 다른 글
[64] 230330 Spring: 회원 정보 수정, 삭제 기능 구현하기. *id값 넘기기 [K-디지털 트레이닝 64일] (0) | 2023.03.30 |
---|---|
[64] 230330 Spring: 회원 상세 정보 보는 페이지 만들기 [K-디지털 트레이닝 64일] (0) | 2023.03.30 |
[63] 230329 Spring: 스프링을 이용한 MVC 구현 [K-디지털 트레이닝 63일] (0) | 2023.03.29 |
[62] 230328 Spring: 로그인 후 게시판 목록 보기, 회원 가입 후 MySQL DB에 추가하기 [K-디지털 트레이닝 62일] (0) | 2023.03.28 |