Spring Boot 시작하기 (2)

최민영·2024년 9월 12일

IntelliJ

목록 보기
9/30

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")'로 만든 테이블도 보인다

0개의 댓글