반응형

STEP 1. JPA 설정

여기서 "# JPA" 설정을 안하면 실제 mysql db에 테이블 생성이 안 됩니다.

반드시 "# JPA" 설정 밑에 두 줄을 추가해야합니다.

 

- application.properties

spring.application.name=demoProject
debug=true

# MySQL 연결 정보
spring.datasource.url=jdbc:mysql://localhost:3306/tdb
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true

 

spring.jpa.properties.hibernate.format_sql=true ==> SQL 쿼리를 여러 줄로 나누어 출력하는 설정으로, 디버깅과 분석을 훨씬 쉽게 만들어 줍니다. 

 

STEP 2. Entity와 DTO를 생성합니다

이 4개를 추가합니다.

repository
 └ UserRepository.java
service
 └ UserService.java
entity
 └ User.java
dto
 └ UserDto.java

 

최종 폴더 구조는 아래와 같습니다.

repository
 └ UserRepository.java
service
 └ UserService.java
entity
 └ User.java
dto
 └ UserDto.java
controller
 └ UserController.java
DemoProjectApplication

 

 

User

package com.example.demoProject.entity;

import com.example.demoProject.dto.UserDto;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Table(name = "user_tb")
@Getter
@Setter
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 자동 생성
    @Column(name = "user_index")
    private Long userIndex; // 사용자 고유 식별자

    @Column(nullable = false, unique = true, length = 100) // 이메일은 고유값
    private String email;

    @Column(nullable = false, unique = true, length = 50) // 닉네임은 고유값
    private String nickname;

    @Column(nullable = false, length = 255) // 패스워드는 암호화된 값으로 저장
    private String passwd;

    @Column(nullable = false, length = 255) // 보안 질문
    private String question;

    @Column(nullable = false, length = 255) // 보안 질문에 대한 답변
    private String answer;

    private User convertToEntity(UserDto dto) {
        User user = new User();
        user.setUserIndex(dto.getUserIndex());
        user.setEmail(dto.getEmail());
        user.setNickname(dto.getNickname());
        return user;
    }
}

//위 엔티티로부터 생성되는 데이터베이스 테이블 스키마는 다음과 같습니다:
//CREATE TABLE users (
//        user_index BIGINT AUTO_INCREMENT PRIMARY KEY,
//        email VARCHAR(100) NOT NULL UNIQUE,
//nickname VARCHAR(50) NOT NULL UNIQUE,
//passwd VARCHAR(255) NOT NULL,
//question VARCHAR(255) NOT NULL,
//answer VARCHAR(255) NOT NULL
//);

 

 

UserDto

package com.example.demoProject.dto;

import com.example.demoProject.entity.User;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class UserDto {

    private Long userIndex;  // 사용자 고유 식별자
    private String email;    // 이메일
    private String nickname; // 닉네임
    private String passwd;   // (선택적으로 사용) 암호화된 비밀번호
    private String question; // (선택적으로 사용) 보안 질문
    private String answer;   // (선택적으로 사용) 보안 질문의 답변

}

 

 

UserController

package com.example.demoProject.controller;

import com.example.demoProject.dto.UserDto;
import com.example.demoProject.service.UserService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController // REST 컨트롤러 선언
@RequestMapping("/api/users") // API 경로 설정
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    // 유저 추가 API
    @PostMapping("/add")
    public ResponseEntity<String> addUser(@RequestBody UserDto userDto) {
        System.out.println("addUser called");
        try {
            userService.addUser(userDto); // Service 계층 호출
            return ResponseEntity.status(HttpStatus.CREATED).body("User added successfully!");
        } catch (IllegalArgumentException e) {
            System.err.println("Error in addUser: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
        }
    }

    // 모든 유저 조회 API
    @GetMapping
    public ResponseEntity<List<UserDto>> getAllUsers() {
        System.out.println("getAllUsers called");
        List<UserDto> users = userService.getAllUsers();
        return ResponseEntity.ok(users); // 200 OK 응답과 함께 반환
    }
}

 

 

UserRepository

package com.example.demoProject.repository;

import com.example.demoProject.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    boolean existsByEmail(String email); // 이메일 중복 확인
    boolean existsByNickname(String nickname); // 닉네임 중복 확인
}

 

 

 

STEP 4. api 테스트

 

curl -X POST http://localhost:8080/api/users/add ^
-H "Content-Type: application/json" ^
-d "{\"email\":\"user1@example.com\",\"nickname\":\"user1\",\"passwd\":\"securepassword\",\"question\":\"What is your favorite color?\",\"answer\":\"Blue\"}"

 

 

curl -X GET http://localhost:8080/api/users

 

결과화면:

[{"userIndex":1,"email":"user1@example.com","nickname":"user1","passwd":null,"question":null,"answer":null}]

 

 

##############################################################################

 

 

 

STEP 1. (선택) 의존성 추가하기

비밀번호 형식을 암호화하는 Spring security를 추가합니다.

- 경로: \demoProject\build.gradle

dependencies {
...
	implementation 'org.springframework.boot:spring-boot-starter-security'
...
}

 

 

 

 

 

 

반응형