inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

MariaDB에 회원가입 정보가 안 들어가집니다.

150

임서하

작성한 질문수 2

0

안녕하세요. 스프링부트와 리액트를 이용해 웹앱을 만들고 있는데요, mariadb를 연결해서 회원가입 정보를 저장하려고 하는데 저장이 안 됩니다. 잘 아시는 분들 코드 한번만 봐주실 수 있을까요?

인터넷과 GPT 모두 이용해보아도 해결이 안 되네요 너무 간절합니다 ㅠㅠ 부탁드립니다.

 

User.java

package com.dohwaji.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Entity
@Table(name = "users")
@Data
@AllArgsConstructor
@Builder
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

 

UserService.java

package com.dohwaji.service;

import com.dohwaji.model.User;
import com.dohwaji.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class UserService {
    @Autowired
    private final UserRepository userRepository;

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User registerUser(User user) {
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        return userRepository.save(user);
    }

    public User authenticate(String username, String password) {
        Optional<User> optionalUser = userRepository.findByUsername(username);
        if (optionalUser.isPresent() && bCryptPasswordEncoder.matches(password, optionalUser.get().getPassword())) {
            return optionalUser.get();
        }
        return null;
    }

    public User createUser(String username, String password) {
        User user = new User(username, password);
        return userRepository.save(user);
    }
}

 

UserRepository.java

package com.dohwaji.repository;

import com.dohwaji.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}

 

AuthController.java

package com.dohwaji.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.dohwaji.service.UserService;

import jakarta.servlet.http.HttpServletRequest;
import com.dohwaji.repository.UserRepository;

import com.dohwaji.model.User;

@RestController     // REST API 컨트롤러임
@RequestMapping("/api/auth")    // 이 컨트롤러의 기본 URL 경로
public class AuthController {
    @Autowired      // UserService 클래스의 인스턴스가 주입
    private UserService userService;    // 사용자 관련 비즈니스 로직을 담당하는 서비스 계층

    @PostMapping("/login")  // HTTP POST 요청이 /api/auth/login 으로 들어오면 이 메서드가 실행됨
    public ResponseEntity<?> login(@RequestBody User loginRequest) {    // login()메서드는 사용자 이름과 비밀번호를 받아 UserService의 authenticate()메서드를 호출
        User user = userService.authenticate(loginRequest.getUsername(), loginRequest.getPassword());
        if (user != null) {
            // 토큰 발행 로직 추가 가능
            return ResponseEntity.ok(user);     // 사용자 인증에 성공하면 사용자 정보를 포함한 HTTP 200 OK 응답을 반환
        } else {
            return ResponseEntity.status(401).body("Invalid credentials");  // 사용자 인증에 실패하면 HTTP 401 Unauthorized 응답을 반환
        }
    }

    @PostMapping("/register")   // HTTP POST 요청이 /api/auth/register 로 들어오면 이 메서드가 실행됨
    public ResponseEntity<?> register(@RequestBody User registerRequest, HttpServletRequest request) {  // register() 메서드는 사용자 정보를 받아 UserService의 registerUser() 메서드를 호출
        User user = userService.registerUser(registerRequest);
        request.getSession().setAttribute("currentUser", user); // 로그인 된 사용자 정보를 세션에 저장
        return ResponseEntity.ok(user);     // 회원가입에 성공하면 새로 생성된 사용자 정보를 포함한 HTTP 200 OK 응답을 반환
    }

    @GetMapping("/logout")
        public String logout(HttpServletRequest request) {
        request.getSession().invalidate(); // 세션 무효화
        return "redirect:/"; // 메인 페이지로 리다이렉트
    }
}

 

build.gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.5'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.dohwaji'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.security:spring-security-crypto'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.mariadb.jdbc:mariadb-java-client'
	implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0'
}

tasks.named('test') {
	useJUnitPlatform()
}

mariadb springboot

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

임서하님, 스프링부트와 리액트를 이용해 웹앱에 회원가입 정보를 MariaDB에 저장하는 과정에서 문제가 발생한 것으로 보이네요. 제공해주신 코드와 설정을 기반으로 몇 가지 확인해볼 사항을 말씀드리겠습니다.

  1. 데이터베이스 연결 설정 확인: application.properties 또는 application.yml 파일에서 MariaDB 연결 정보(예: spring.datasource.url, spring.datasource.username, spring.datasource.password)가 올바르게 설정되었는지 확인해주세요. 설정이 누락되거나 잘못된 정보가 입력되어 있으면 데이터베이스에 접근할 수 없습니다.

  2. JPA 엔티티와 테이블 매핑: User 클래스에서 @Entity@Table 애노테이션을 사용해 엔티티를 정의하셨는데, MariaDB 내에 users 테이블이 있는지, 그리고 필드가 User 엔티티의 필드와 일치하는지 확인하세요. 엔티티와 데이터베이스 테이블 간의 불일치는 데이터 저장에 실패할 수 있습니다.

  3. 트랜잭션 관리: 스프링에서 데이터를 저장할 때 트랜잭션 관리가 중요합니다. UserServiceregisterUser 메소드 등 데이터를 변경하는 로직에 @Transactional 애노테이션을 추가하여 트랜잭션 처리를 해보세요. 트랜잭션이 제대로 처리되지 않으면 데이터베이스에 변화가 반영되지 않을 수 있습니다.

  4. 로깅과 디버깅: 스프링 부트 애플리케이션의 application.properties 또는 application.yml 파일에 spring.jpa.show-sql=true 설정을 추가하여 JPA가 실행하는 SQL 문을 콘솔에서 확인할 수 있습니다. 이를 통해 실제 수행되는 SQL 쿼리를 확인하고 문제를 진단해보세요.

  5. 예외 처리와 로그 찍기: UserRepository.save() 호출 시 발생할 수 있는 예외를 적절히 처리하고, 로그를 찍어서 어떤 문제로 데이터가 저장되지 않는지 확인해보세요.

위 사항들을 하나씩 점검해보시면 문제의 원인을 찾고 해결하는 데 도움이 될 것입니다. 만약 여전히 문제를 해결하기 어렵다면, 보다 구체적인 오류 메시지나 로그 내용과 함께 다시 문의해주세요.

수강기간 연장

0

29

1

FTS 방식으로 수행하는 나쁜 SQL 에서 질문이 있습니다.

0

54

0

7-8 질문

0

55

1

Kotlin과 Java의 현업에서의 활용

0

129

2

강의 기간 연장이 가능할까요?

0

79

1

OnPropertyChanged 해서 선택된 것에서 수정하면

0

86

1

Image Source 관련 질문입니다.

0

84

1

다음과 같은 쿼리가 더 좋은 결과를 보이는데 이유가 뭔지 궁금합니다.

0

139

1

rollup mariadb 11 ver 기준

0

128

1

use index, force index 힌트 질문

0

238

1

BNL Join 사용

0

131

1

select_type 에서 'simple' 경우 각각의 테이블이 '드라이빙' 또는 '드리븐' 인지 어떻게 알수 있나요?

0

108

0

스프링부트,Mysql작업시 빌드

0

277

1

start.spring.io 에서 dependencies 에 아무것도 추가를 안하면

0

420

1

@ConditionalOnMissingBean 관련 질문이 있습니다!

0

294

1

수업자료 MARIADB설치PPT - 10.7.3버전이 없네요..

0

183

1

Maria DB 설치 관련해서 다운로드 문의

0

389

1

[스토리 그 자체, 실적 테이블](9:51)max_recursive_iterations

1

561

2

urlcodemap 쿼리 파일 확인요청

1

314

2

[공유][대사와 액션, 회차정보테이블]contents2 생성관련

1

406

2

[주인공과 등장인물의 집합채, 웹소설정보테이블]작가명 생성관련

1

301

1

[주인공과 등장인물의 집합체,웹소설정보테이블]wn_novel테이블 생성

1

254

1

[ERD로 보는 스토리와 테이블이라는 등장인물]태그정보 테이블 설계관련

1

283

1

[가상데이터 생성]

1

226

1