스프링(Spring)/스프링부트(SpringBoot)
[스프링부트(SpringBoot)] 03. User 개체를 JPA 데이터베이스 연동하기
2024. 11. 17. 22:53반응형
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'
...
}
반응형
'스프링(Spring) > 스프링부트(SpringBoot)' 카테고리의 다른 글
[스프링부트(SpringBoot)] 04. User JPA 확장하기 및 API 명세 (0) | 2024.11.19 |
---|---|
[스프링부트(SpringBoot)] 00. Linux에서 스프링부트 띄우기 (0) | 2024.11.17 |
[스프링부트(SpringBoot)] 02. 컨트롤러 추가하기 (0) | 2024.11.17 |
[스프링부트(SpringBoot)] API 문서 설계 예시 (0) | 2024.11.17 |
[스프링부트(SpringBoot)] 01. 기본 프로젝트로 Hello world 띄우기 (0) | 2024.11.17 |