점심 내 수강신청에 대해 고민함. 으악.
전공3개 교직 2개면 될 것 같은데.
<14:30 5교시>
html로부터 탈출되어서 뿌려진다. 꺽쇄를 <, >라고 표기해서
unescape 기능은 마크업이 기능을 하는 것에서 탈출 시켜준다.
//기본적인 타임리프 익힌거임.
DB 연동해보기 : MyBatis 사용할 거임 -> 이클립스 마켓 플레이스 가서 MyBatis랑 MyBatipse 모두 설치
(MyBatis를 설치한게 아니라 MyBatis를 사용할 때 도움 줄 애들을 설치한거라 보면 됨.
데이터베이스에 연결할, context.xml에 있었던 애들과 비슷한 애들을 설정해주기
resources 폴더에 new folder : mapper 만들기, controller 패키지와 repository 패키지 만들기
<15:30 6교시>
의존 관계를 느슨하게 하기 위해서 Interface 를 활용
구현 클래스 만들기 : 에러 나면 add unimplemented 눌러서 해결
이 Dao는 생성됨과 동시에 Spring Bean Container에서 생성된 객체를 관리
MemberController로 넘어가서
selectList나 selectOne을 많이 사용할 것임.
SQL Select문의 선택 결과가 여러 row의 목록(list의 타입은 정해져 있지 않다)이거나 한 row(이또한 결과값의 타입이 정해져 있지 않다)인 경우라고 생각하면 됨.
Object parameter는 Select문을 하는데 있어서 전달해야 하는 parameter들이다.
MyBatis는 실행할 SQL 문을 DAO에 직접 작성하지 않고 xml 문서로 실행할 sql문을 작성한다.
이게 무슨 소리냐면 파일을 하나 더 만들어야 한다는 소리이다.
위에서 select 된 row 하나를 어떤 type 에 담을지 MyBatis에게 알려주어야 한다.
select 된 row를 어떤 type에 담을지를 설정하는 방법 : resultType ="com.exmple.spring05.dto.MemberDto"
셀렉트한 결과가 여러 row면 알아서 list에 담아준다.
다만 Dao 에서 selectList를 썼는지 selectOne을 썼는지에 따라 리턴되는 결과값이 달라진다.
단 이 모든 것의 전제는 Dto의 필드이름과 데이터베이스의 칼럼명(별칭을 사용해서라도)이 동일해야 한다.
<16:30 7교시>
Spring Bean 컨테이너에서 관리되는 애들
1. MemberController 객체 by@Controller
2. MemberDaoImpl 객체 by @Component
3. SqlSession객체는 by @Component 또는 자체설정
Spring Bean 끼리는 서로 dependency 의존 상태인데, 서로도 의존 할 수 있음
주입할 때는 Interface 타입으로 주입 받아야 햠.
그리고 서로 dependency injection이 일어나서 MemberDaoImpl을 MemberController에서 사용 가능하다.
수업시간에 했던거 따라가기 바빠서 캡처는 다 못했음
MemberDto
package com.example.spring05.dto;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class MemberDto {
private int num;
private String name;
private String addr;
}
MemberDao
package com.example.spring05.repository;
import java.util.List;
import com.example.spring05.dto.MemberDto;
public interface MemberDao {
public List<MemberDto> getList();
public void insert(MemberDto dto);
public void update(MemberDto dto);
public void delete(int num);
public MemberDto getData(int num);
}
MemberDaoImpl
package com.example.spring05.repository;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.example.spring05.dto.MemberDto;
//dao를 bean으로 만들기 위한 어노테이션
@Repository
public class MemberDaoImpl implements MemberDao{
//MyBatis 기반으로 DB 관련 작업을 하기 위한 핵심 의존 객체를 DI받는다.
@Autowired
private SqlSession session;
@Override
public List<MemberDto> getList() {
//SqlSession 객체를 이용해서 회원 목록을 얻어옴
List<MemberDto> list= session.selectList("member.getList");
return list;
}
@Override
public void insert(MemberDto dto) {
//Mapper 의 namespace:member, sql의 id:insert, parameterType :MemberDto
session.insert("member.insert", dto);
}
@Override
public void update(MemberDto dto) {
session.update("member.update", dto);
}
@Override
public void delete(int num) {
session.delete("member.delete", num);
}
@Override
public MemberDto getData(int num) {
MemberDto dto=session.selectOne("member.getData", num);
return dto;
}
}
MemberMapper
<?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="member">
<delete id="delete" parameterType="com.example.spring05.dto.MemberDto">
delete from member
where num=#{num}
</delete>
<update id="update" parameterType="com.example.spring05.dto.MemberDto">
update member
set name = #{name}, addr=#{addr}
where num=#{num}
</update>
<insert id="insert" parameterType="com.example.spring05.dto.MemberDto">
insert into member
(num, name, addr)
values (member_seq.nextval, #{name}, #{addr})
</insert>
<select id="getList" resultType="com.example.spring05.dto.MemberDto">
select num, name, addr
from member
order by num asc
</select>
<select id="getData" parameterType="int" resultType="com.example.spring05.dto.MemberDto">
select num, name, addr
from member
where num=#{num}
</select>
</mapper>
MemberController
package com.example.spring05.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.tags.Param;
import com.example.spring05.dto.MemberDto;
import com.example.spring05.repository.MemberDao;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import jakarta.websocket.Session;
@Controller
public class MemberController {
@Autowired
private MemberDao dao;
// 매개변수에 MemberDto 타입을 선언하면 form 전송되는 파라미터가 자동 추출되어서 MemberDto 객체에 담긴채로 참조값이 전달된다.
// 단,form에서 전송되는 파라미터가 Dto의 필드명과 동일해야 한다.
@GetMapping("/member/delete")
public String delete(int num) {
dao.delete(num);
return "member/delete";
}
@PostMapping("/member/update")
public String update(MemberDto dto) {
dao.update(dto);
return "member/update";
}
@GetMapping("/member/updateform")
public String updateForm(@RequestParam("num")int num ,Model model) {
MemberDto dto=dao.getData(num);
model.addAttribute("dto", dto);
return "member/updateform";
}
@PostMapping("/member/insert")
public String insert(MemberDto dto) {
dao.insert(dto);
return "member/insert";
}
@GetMapping("/member/new")
public String newForm() {
return "member/new";
}
@GetMapping("/member/list")
public String list(Model model, HttpSession session) {
//주입받은 MemberDao 객체를 이용해서 회원 목록을 얻음
List<MemberDto> list=dao.getList();
//Model 객체에 담는다
model.addAttribute("list",list);
//타임리프의 view 페이지에서 회원 목록을 응답함
return "member/list";
}
}
list.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>/templates/member/list.ahtl</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" />
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container">
<h1>회원 목록입니다</h1>
<a th:href="@{/member/new}">회원추가</a>
<table class="table table-bordered">
<thead class="table-dark">
<tr>
<th>번호</th>
<th>이름</th>
<th>주소</th>
<th>수정</th>
<th>삭제</th>
</tr>
</thead>
<tbody>
<tr th:each="tmp:${list}">
<td>[[${tmp.num}]]</td>
<td>[[${tmp.name}]]</td>
<td th:text="${tmp.addr}"></td>
<td><a th:href="@{/member/updateform(num=${tmp.num})}">수정</a></td>
<td><a th:href="@{/member/delete(num=${tmp.num}, name=${tmp.name})}">삭제</a></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
new.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>/templates/member/new.html</title>
</head>
<body>
<div class="container">
<h1>회원 정보 추가 양식</h1>
<form th:action="@{/member/insert}" method="post">
<input type="text" name="name" placeholder="이름 입력..." />
<input type="text" name="addr" placeholder="주소 입력..." />
<button type="submit">추가</button>
</form>
</div>
</body>
</html>
insert.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>/templates/member/insert.html</title>
</head>
<body>
<div class="container">
<h3>알림</h3>
<p>
<strong th:text="${param.name}"></strong>님의 정보가 저장되었습니다. <!-- 파라미터로 전송된 이름 데이터 -->
<a th:href="@{/member/list}"> 확인 </a>
</p>
</div>
</body>
</html>
<17:30 8교시~ 야자시간 7:15분>
과제로 내준거 해결 하고 감. 해결 시간 7:15분 블로그 마무리하고 갈 예정.
list.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>/templates/member/list.ahtl</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" />
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container">
<h1>회원 목록입니다</h1>
<a th:href="@{/member/new}">회원추가</a>
<table class="table table-bordered">
<thead class="table-dark">
<tr>
<th>번호</th>
<th>이름</th>
<th>주소</th>
<th>수정</th>
<th>삭제</th>
</tr>
</thead>
<tbody>
<tr th:each="tmp:${list}">
<td>[[${tmp.num}]]</td>
<td>[[${tmp.name}]]</td>
<td th:text="${tmp.addr}"></td>
<td><a th:href="@{/member/updateform(num=${tmp.num})}">수정</a></td>
<td><a th:href="@{/member/delete(num=${tmp.num}, name=${tmp.name})}">삭제</a></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
MemberController.java
package com.example.spring05.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.tags.Param;
import com.example.spring05.dto.MemberDto;
import com.example.spring05.repository.MemberDao;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import jakarta.websocket.Session;
@Controller
public class MemberController {
@Autowired
private MemberDao dao;
// 매개변수에 MemberDto 타입을 선언하면 form 전송되는 파라미터가 자동 추출되어서 MemberDto 객체에 담긴채로 참조값이 전달된다.
// 단,form에서 전송되는 파라미터가 Dto의 필드명과 동일해야 한다.
@GetMapping("/member/delete")
public String delete(int num) {
dao.delete(num);
return "member/delete";
}
@PostMapping("/member/update")
public String update(MemberDto dto) {
dao.update(dto);
return "member/update";
}
@GetMapping("/member/updateform")
public String updateForm(@RequestParam("num")int num ,Model model) {
MemberDto dto=dao.getData(num);
model.addAttribute("dto", dto);
return "member/updateform";
}
@PostMapping("/member/insert")
public String insert(MemberDto dto) {
dao.insert(dto);
return "member/insert";
}
@GetMapping("/member/new")
public String newForm() {
return "member/new";
}
@GetMapping("/member/list")
public String list(Model model, HttpSession session) {
//주입받은 MemberDao 객체를 이용해서 회원 목록을 얻음
List<MemberDto> list=dao.getList();
//Model 객체에 담는다
model.addAttribute("list",list);
//타임리프의 view 페이지에서 회원 목록을 응답함
return "member/list";
}
}
update.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<h3>알림</h3>
<p>
<strong th:text="${param.name}"></strong>님의 정보가 수정되었습니다. <!-- 파라미터로 전송된 이름 데이터 -->
<a th:href="@{/member/list}"> 확인 </a>
</p>
</div>
</body>
</html>
delete.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<h3>알림</h3>
<p>
<strong th:text="${param.name}"></strong>님의 정보가 삭제되었습니다. <!-- 파라미터로 전송된 이름 데이터 -->
<a th:href="@{/member/list}"> 확인 </a>
</p>
</div>
</body>
</html>
'자바풀스택 과정 > 자바 풀 스택 : 수업내용정리' 카테고리의 다른 글
자바 풀 스택 2/19 오후 기록 058-2 (0) | 2025.02.19 |
---|---|
자바 풀 스택 2/19 오전 기록 058-1 (0) | 2025.02.19 |
자바 풀 스택 2/18 오전 기록 057-1 (0) | 2025.02.18 |
자바 풀 스택 2/17 하루 기록 056 (0) | 2025.02.17 |
자바 풀 스택 2/14 하루 기록 055 (0) | 2025.02.14 |