1) application yml 파일
-> src > main > resources 아래에 'application.yml'이라는 파일을 생성한다 (기존에 존재하던 application.properties 파일은 삭제)
-> 추후에 DB에 관한 정보도 이 yml 파일에 저장하게 된다
server:
port: 8080
시작 단계인만큼 포트번호만 설정한다
2) index.html 수정
이후의 페이지 연결을 위해 "/member/save"와 "/member/login"과 연결되는 '회원가입'과 '로그인' 버튼을 생성한다
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h2>spring boot start page</h2>
<a href="/member/save">회원가입</a>
<a href="/member/login">로그인</a>
</body>
</html>
3) MemberController 생성
src > main > java > 패키지경로 > controller 아래에 MemberController를 생성한다
package com.example.member.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MemberController {
@GetMapping("/member/save")
public String saveForm() {
return "save";
}
}
"/member/save" 주소로 mapping 요청이 들어오면 saveForm 함수를 통해 "save.html" 파일로 연결시킨다
4) save.html 구성
(html 파일의 기본 틀을 만들 때는 ! + tab 버튼을 누르면 된다)
(사용하려는 문법의 경우 form + tab 버튼을 누르는 형태로 자동완성)
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>save</title>
</head>
<body>
<form action="/member/save" method="post">
이메일 : <input type="text" name="memberEmail"> <br>
비밀번호 : <input type="password" name="memberPassword"> <br>
이름 : <input type="text" name="memberName"> <br>
<input type="submit" value="회원가입">
</form>
</body>
</html>

실행해보면 작성한 save.html 내용이 출력되는 것을 확인할 수 있다
'회원가입' 이라는 버튼을 누르면 최종적으로 form action이 실행되는데, "/member/save"라는 주소로 "post"를 요청하게 된다
4) "/member/save"로 들어오는 'post' 요청 처리하기
MemberController.java 파일에는 @GetMapping만 설정된 상태이므로 post를 수행하기 위해 @PostMapping을 작성한다
@PostMapping("/member/save")
public String save(@RequestParam("memberEmail") String memberEmail,
@RequestParam("memberPassword") String memberPassword,
@RequestParam("memberName") String memberName) {
System.out.println("memberEmail = " + memberEmail + ", memberPassword = " + memberPassword + ", memberName = " + memberName);
return null;
}
(별건 아니지만 은근 중요한 .. 'soutp'를 입력하고 tab을 누르면 변수를 확인할 수 있다)
아직 회원가입 완료 페이지를 작성하지 않아서 return에는 null을 뒀다
5) dto/entity/repository/service 패키지 만들기
src > main > java > 패키지경로 아래에 dto / entity / repository / service 라는 이름의 패키지들을 하나씩 만들어준다

6) MemberService 파일 생성
service 패키지 아래에 'MemberService'라는 자바 클래스를 생성한다
-> @Service 어노테이션
7) MemberDTO 파일 생성
dto 패키지 아래에 'MemberDTO'라는 자바 클래스를 생성한다
-> @Getter/Setter/NoArgsConstructor/ToString 어노테이션
-> id/memberEmail/memberPassword/memberName 변수 선언
package com.example.member.dto;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.stereotype.Service;
@Getter
@Setter
@NoArgsConstructor
@ToString
public class MemberDTO {
private Long id;
private String memberEmail;
private String memberPassword;
private String memberName;
}
8) MemberController에서 MemberDTO 사용하기
아까 MemberController에서 memberEmail/memberPassword/memberName을 @RequestParam을 통해 귀찮게 가져왔던 부분을 @ModelAttribute를 통해 쉽게 가져올 수 있게 되었다
public String save(@ModelAttribute MemberDTO memberDTO)
-> spring이 각 매개변수에 맞는 항목을 알아서 @Setter를 통해 담아줌
-> @ModelAttribute는 생략해도 괜찮음
9) MemberController에 MemberService의 객체 주입
-> @RequiredArgsConstrucgor 어노테이션
-> private final MemberService memberService 선언을 통해 memberService 객체를 주입한다 (생성자 주입)
-> MemberController에서 memberService.(함수)를 사용할 수 있게 된다
10) MemberService에 MemberRepository 주입
-> @RequiredArgsConstructor 어노테이션
-> private final MemberRepository memberRepository 선언을 통해 memberRepository 객체 주입
11) memberRepository 설정 전 DB 관련 설정 해두기
-> build.gradle 파일의 dependencies 부분에
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java'
두 줄 추가하고 새로고침
12) application.yml 파일에 DB 정보 입력
server:
port: 8080
# database 연동 설정
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/MySQL?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
username: root
password: 1015
thymeleaf:
cache: false
# spring data jpa 설정
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: false
show-sql: true
hibernate:
ddl-auto: update
지금 내 mysql의 경우 MySQL이라는 이름으로 username과 password는 각각 root와 1015를 사용하고 있다
잘 되었다면 왼쪽의 데이터베이스 아이콘을 눌러 Test Connection을 실행했을 때 성공했다고 뜰 것이다
13) MemberRepository 생성하기
이 파일은 java class에서 java가 아니라 interface로 설정하고 생성한다
package com.example.member.repository;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MemberRepository extends JpaRepository<MemberEntity, Long> {
}
14) MemberEntity 생성하기
package com.example.member.entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
@Entity
@Setter
@Getter
@Table(name="member_table")
public class MemberEntity {
@Id //primary key 지정
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique=true) //unique 제약 조건 추가
private String memberEmail;
@Column
private String memberPassword;
@Column
private String memberName;
}
-> @Entity/Setter/Getter/Table 어노테이션
-> MemberEntity 아래에는 primary key로 @Id를 꼭 하나 지정해야 한다
-> 그 외의 일반 entity는 @Column으로 지정
15) 새로 만든 파일들 import
MemberRepository에서 새로 만들었던 MemberEntity import
MemberSerivce에서 새로 만들었던 MemberRepository import
error) 잠깐 실행해보려는데 안되더라고요 ..~~ 이젠 뭐 놀랍지도 않음

'com.mysql.cj.jdbc.Driver' 나 진짜 많이 괴롭힌다
그러고보니 application.yml 파일의 7번째 줄에
'driver-class-name: com.mysql.cj.jdbc.Driver' 에서 mysql~Driver까지 빨간줄이 뜬 것이 아니겠는가
똑같은 해결책만 보다가 이 해결책 보고 해결했다
build.gradle 파일의 dependencies 안에 아래의 세 줄을 추가하면 된다
implementation 'org.springframework.boot:spring-boot-starter'
runtimeOnly 'com.mysql:mysql-connector-j'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
error2) 에러가 끝난 줄 알았다면 대단한 착각임
org.hibernate.boot.registry.selector.spi.StrategySelectionException
뭐 이런 오류가 뜨면서 또 자기 멋대로 종료되었는데,
spring data jpa 설정할 때 hibernate 버전 5를 사용해서 그렇다고 한다
application.yml 파일의 18번째 줄을 아래의 코드로 변경한다
(~.MySQL5InnoDBDialect -> ~.MySQLDialect)
database-platform: org.hibernate.dialect.MySQLDialect
그러고나니 잘 실행이 되었다

MemberEntity에서 '@Table(name="member_table")'로 만든 테이블도 보인다