[오늘의 개발목표]
내가 만드는 스프링부트 프로젝트에 MyBatis를 붙여보자!
[해야할 일]
- 스프링부트 프로젝트 만들기
- 데이터베이스 생성 (테이블, 컬럼 설정 등)
- 스프링부트에 Mybatis 설정하기
- 테스트를 위해 회원 목록 만들기
1. 스프링부트 프로젝트 만들기
- 나는 보통 스프링스타터를 이용해서 프로젝트를 생성한다.
- 보통 디펜던시에 롬복, 스프링웹, 타임리프 정도만 넣어두는데 이번에는 MySQL과 Mybatis도 사용하기 때문에 둘과 관련된 디펜던시도 미리 추가해준다.
스프링스타터에 관해 자세히 알아보려면 아래의 포스팅을 확인하세요.
(스프링 스타터로 프로젝트 생성하는 법, 생성한 프로젝트를 인텔리제이에서 빌드하는 법 포함)
[인텔리제이/스프링] 스프링스타터로 스프링 프로젝트 생성하기
스프링 프로젝트를 만들 때 스프링스타터 사이트를 이용하면 간편하게 만들 수 있음. 1. 스프링 스타터 사이트 접속 https://start.spring.io/ 2. 아래와 같은 화면이 있을 텐데 만들 프로젝트의 설정을
ddururiiiiiii.tistory.com
프로젝트를 빌드해서 Build.gradle 확인해보면 myBatis와 mySQL관련 디펜던시가 추가된것을 확인할 수 있다.
(+) 혹시 버전이 안맞는 것같다면 아래의 사이트에서 확인해보는 것도 도움이 된다.
https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
mybatis-spring-boot-autoconfigure – Introduction
Introduction Translations Users can read about MyBatis-Spring-Boot-Starter in the following translations: What is MyBatis-Spring-Boot-Starter? The MyBatis-Spring-Boot-Starter help you build quickly MyBatis applications on top of the Spring Boot. By using t
mybatis.org
2. 데이터베이스 생성 (테이블, 컬럼 설정 등)
나는 데이터베이스 툴로 디비에버를 사용하고 있어 디비에버 기준으로 설명할 예정.
1) 데이터베이스 생성하기
- 먼저 데이터베이스가 연결은 된상태여야 함. (데이터베이스 연결방법은 하단에 따로 포스팅 주소 남겨놓음)
- [Database Navigat] 좌측 메뉴에서 localhost -> Database -> 오른쪽 버튼 [Create New Database] 클릭.
- 생성할 데이터베이스 이름을 정해주고 아래는 Utf8mb4로 해준다. 이모지까지 입력이 된다고 함.
- 그리고 나서 다시 확인해보면 데이터베이스가 잘 생성된 것을 알 수 있다.
MySQL과 디비에버 설치법이 궁금하다면?
[MySQL] 설치하기 MAC(맥북) Ver
나는 맥북(M1)을 사용한다. 맥북에 MySQL을 설치해보기로 한다. 1. MySQL 다운로드 1) https://dev.mysql.com/downloads/mysql/ 사이트 접속 Select Version : 걍 최신으로 했음. Select Operation System : 나는 맥북이니까 Mac
ddururiiiiiii.tistory.com
2. 테이블 생성하기
테이블을 생성하려면 Create문을 입력해야 하는데 하나하나 손으로 작성하려면 넘나 귀찮은것....
혹시 Create문을 자동으로 만들어주는 프로그램이 분명 있을 것 같아서 찾아보다가 아주 유용한 프로그램을 알게 되었다.
AQueryTool
AQueryTool은 웹 기반 ERD 툴 + SQL 자동 생성 프로그램입니다.
aquerytool.com
위의 링크를 클릭하면 AQueryTool 이라는 사이트로 이동하는데
여기서 간단하게 ERD를 그리고 내보내고 저장하고 또 그것을 SQL문으로 변환해준다.
너무..멋지잖아..!
AQueryTool 툴을 이용해 만든 간단 ERD 는 이러하다.
일단 최소화..최소화...!
여기서 SQL문을 뽑아 내서 테이블을 생성해준다!
기본적인 사용법은 따로 포스팅을 했으니 아래의 포스팅을 확인해보세요!
[SQL] SQL 자동생성해주는 사이트 aquerytool 사용하기
데이터베이스 만들 때.....테이블 create문 자동으로 생성해주는 사이트 없을까...! 있다...! 사이드 프로젝트 중 테이블을 생성해야 하는데 create문을 일일히 작성하려니 이것도 일이라는 생각이 들
ddururiiiiiii.tistory.com
3. 스프링부트에 Mybatis 설정하기
다시 스프링부트로 돌아와서 빌드한 후 서버 돌려보면 에러 난다. 서버도 가동이 안되고 콘솔 에러가 뜸.
보니까 마이바티스랑 MySQL쓰기로 해놓고 설정을 안해놔서 에러가 나는 것 같음. 그럼 설정을 해줘야지!
application.properties 수정
spring.datasource.url: jdbc:mysql://localhost:3306/데이터베이스이름?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username: 계정아이디
spring.datasource.password: 비밀번호
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
mybatis.mapper-locations=classpath:/mapper/**/*.xml
- spring.datasource.url : 내 데이터베이스 주소를 연결해줘야 하는데 디비에버보면(아래이미지 참조) localhost:3306이라고 나와있음 그걸 쓰면 됨. 데이터베이스이름은 물론 내가 생성한 데이터베이스 이름을 써줘야 함. 나의 경우 book_rental_system
(+) 참고하기
- spring.datasource.username / spring.datasource.password : MySQL 생성시 설정했던 계정아이디와 비밀번호를 적어줌.
- mybatis.mapper-locations=classpath:/mapper/**/*.xml : 나머지 항목은 필수사항은 필수사항인데 이 부분은 안써도 되긴 됨. 이걸 안쓰면 xml위치를 나중에 생성할 Mapper랑 패키지 구조 똑같이 해줘야 인식을 함. 이걸 쓰면 xml을 좀 더 잘 정리할 수 있어서 난 쓰기로..!
여기까지만 설정하고 서버를 돌려보면 서버는 문제없이 돌아갈 것임. 그래야 함!
4. 테스트를 위해 회원 목록 만들기
1) Member.java
package seulgi.bookRentalSystem.domain.member;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
@Getter @Setter
@RequiredArgsConstructor
public class Member {
private String memberId;
private String memberName;
private String password;
}
2) MemberMapper.java
package seulgi.bookRentalSystem.domain.member;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface MemberMapper {
List<Member> allMemberList();
}
3) MemberService.java
package seulgi.bookRentalSystem.domain.member;
import java.util.List;
public interface MemberService {
public List<Member> allMemberList();
}
4) MemberServiceImpl.java
package seulgi.bookRentalSystem.domain.member;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService{
private final MemberMapper memberMapper;
@Override
public List<Member> allMemberList() {
return memberMapper.allMemberList();
}
}
5) MmemberMapper.xml
<?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="seulgi.bookRentalSystem.domain.member.MemberMapper">
<select id="allMemberList" resultType="seulgi.bookRentalSystem.domain.member.Member">
SELECT
MEMBER_ID AS memberId
, MEMBER_NAME AS memberName
, PASSWORD
FROM MEMBER_TB;
</select>
</mapper>
- namespace는 MemberMapper의 경로를 써주면 된다.
(+) resultType이 너무 줄줄이 긴데;;;;?
mybatis.type-aliases-package=seulgi.bookRentalSystem.domain.member
- 줄일수 있음! application.properties 에 위처럼 추가해주면 resultMap="Member"만 써줘도 됨. 근데, 나는 폴더 구조가 dto, service, mapper를 분리하지 않고 도메인별로 나눠서 저렇게 사용하는 건 적절하지 않은 듯하여 그냥 일단은 줄줄이 써보기로함;
(+) alias 왜 따로 줬냐?
원래 알리아스 안주고 select * from member_tb; 이런식으로 했는데 멤버아이디랑 멤버이름을 못가져오는거임.
- 보다시피 스프링부트에서는 memberId 이고 테이블에서는 MEMBER_ID라서 인식을 못하는거임. 패스워드는 똑같아서 가져오는 거고...전자정부 쓸 때는 자동변환이 가능했는데....이건 없구나.....그래서 일단 알리아스를 주는 방법으로 했음. 추후에 변경할 예정.
6) MemberController.java
package seulgi.bookRentalSystem.domain.member;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberController {
private final MemberServiceImpl memberService;
/**
* 회원 목록 조회
* @param model
* @return
*/
@GetMapping
public String allMemberList(Model model){
List<Member> members = memberService.allMemberList();
model.addAttribute("members", members);
return "member/allMemberList";
}
}
7) allMemberList.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<link href="../css/bootstrap.min.css"
th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
</head>
<body>
<div class="container" style="max-width: 600px">
<div class="py-5 text-center">
<h2>상품 목록</h2> </div>
<div class="row">
<div class="col">
<button class="btn btn-primary float-end" onclick="location.href='addForm.html'" type="button">상품
등록</button> </div>
</div>
<hr class="my-4">
<div>
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>이름</th>
<th>비밀번호</th>
</tr>
</thead>
<tbody>
<tr th:each="member : ${members}">
<td><a href="member.html" th:href="@{/basic/members/{memberId} (memberId=${member.memberId})}" th:text="${member.memberId}">회원id</a></td>
<td><a th:text="${member.memberName}">이름</a></td>
<td><a th:text="${member.password}">비밀번호</a></td>
</tr>
</tbody>
</table>
</div>
</div> <!-- /container -->
</body>
</html>
[구현화면]
- (+) 회원 테이블에 더미 데이터 하나 넣었다
- (+) 부트스트랩 적용했다.
후우우우우우웅 너무 힘들었다... 그치만 재밋었다..!
참고
[Spring Boot] 스프링부트에서 Mybatis 사용하기
먼저 Mybatis를 얘기하기 전에 JAVA의 ORM이 무엇이 있는지 어떤 것인지에 대해서 정리해보자. ORM(Object Relational Mapping)이란? ORM에서 Object는 객체지향 언어의 객체를 의미한다. Relational은 관계형 데이
devlog-wjdrbs96.tistory.com
'💻 뚝딱뚝딱 > 팀내도서대여시스템(OBRS)' 카테고리의 다른 글
[개발일지#005] 데이터베이스 수정작업 그리고 그에 따른 XML 수정 (0) | 2024.04.06 |
---|---|
[개발일지#004] 타임리프 레이아웃 적용 및 네비게이션 바 생성/디자인 및 구현 (0) | 2024.04.05 |
[개발일지#003] 책 등록 / 책 정보수정 / 책 목록조회 구현 (0) | 2024.04.02 |
[개발일지#002] 회원 가입 / 회원조회(단건) / 회원정보수정 구현 (1) | 2024.04.01 |
[개발일지#000] 팀내도서대여시스템 제작계기 & 사용기술스택 & 최소요구사항 (0) | 2024.03.27 |