관리 메뉴

bright jazz music

blog 30 : 고정인증 로그인 기능 구현 1 본문

Projects/blog

blog 30 : 고정인증 로그인 기능 구현 1

bright jazz music 2023. 2. 14. 07:41

지난 포스팅에서는 인증값을 헤더에 넣어서, 헤더에 "Authorization" 값이 존재하는 경우 API에 접근할 수 있도록 하였다. 그러나 이렇게 값이 있기만 해도 인증을 완료하는 경우는 거의 없다. 보통은 DB에서 매칭 작업을 하고 나서 토큰을 발급하여 인증하도록 하는 것이 일반적이다.

 

(DB에서 사용자 확인 - 매칭 - 토큰발급

 

토큰은 로그인 시에 발급받는 것이 일반적이다. 현재 로그인 기능이 존재하지 않으므로 로그인 기능을 만들어야 한다.

 

1. 로그인을 위한 컨트롤러 생성: AuthController.java

 

//AuthController.java

package com.endofma.blog.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class AuthController {
    
    @PostMapping("/auth/login")
    public void login(){
        //json으로 ID/PW 수신
        //DB에서 조회
        //토큰 응답
    }
}

 

 

2. 로그인 테스트를 위한 인텔리제이 http 파일 생성:  auth.http

 

 

3. 로그인에 사용할 클래스 생성: Login.java

 

 

//Login.java

package com.endofma.blog.request;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.validation.constraints.NotBlank;

@Getter
@Setter
@ToString
public class Login {
    @NotBlank(message = "이메일을 입력해 주세요")
    private String email;
    @NotBlank(message = "비밀번호를 입력해 주세요")
    private String password;
}

 

4. AuthController에서 작동 확인

//AuthController.java

package com.endofma.blog.controller;

import com.endofma.blog.request.Login;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequiredArgsConstructor
public class AuthController {

    @PostMapping("/auth/login")
    public void login(@RequestBody Login login){
    
    //json ID/PW
        log.info(">>> login = {}", login.toString());

    }
}

 

### auth.http

POST http://localhost:8080/auth/login
Content-Type: application/json

{
  "email" : "catnails@gmail.com",
  "password" : "1234"
}

 

요청 발송. 200. Response Body is empty

 

 

5. Entity 생성: User.java

들어온 값을 확인하기 위해 DB값을 조회하여 매칭해야 한다. 우선은 이 때 사용할 Repository와 Entity를 생성해 보자. Service는 그 이후에 생성한다.

//User.java

package com.endofma.blog.domain;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.time.LocalDateTime;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    private String email;
    
    private String password;
    
    private LocalDateTime createdAt;
}

user라는 이름으로 테이블을 생성해야 하는데 user가 예약어라 오류 발생함. 이 포스팅의 맨 아래에 해결 방법 추가하였음.

 

 

6. UserRepository 생성

 

//UserRepository.java

package com.endofma.blog.repository;

import com.endofma.blog.domain.User;
import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Long> {

}

 

7. 서버 기동

 

빌드 * 오류발생

GenerationTarget encountered exception accepting command : Error executing DDL "create table user (id bigint generated by default as identity, created_at timestamp, email varchar(255), name varchar(255), password varchar(255), primary key (id))" via JDBC Statement

"User"가 예약어이기 때문에 발생하는 문제이다.

 

아래와 같이 User엔티티에 @Table(name="users") 어노테이션을 부착하여 테이블 명을 변경해줬다.

//User.java

package com.endofma.blog.domain;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name="users") //테이블 명 설정 user는 예약어라 오류발생
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String email;

    private String password;

    private LocalDateTime createdAt;
}

 

https://velog.io/@choidongkuen/Springboot-User-%EC%98%88%EC%95%BD%EC%96%B4-%EC%98%A4%EB%A5%98

 

[Springboot] org.hibernate.to ol.schema.spi.CommandAcc eptanceException: Error executing DDL " 오류

안녕하세요 오늘은 제거 프로젝트를 진행하면서 겪었던 '예약어 오류'에 대해서 공유하고자 합니다 👨‍💻먼저 이해를 위해 제가 구현한 클래스부터 소개하겠습니다.

velog.io

 

 

재기동 하면 빌드 성공

 

8. http 테스트

auth.http를 실행하여 요청을 발송한다. 아래와 같이 값이 잘 들어오는 모습을 확인할 수 있다.

성공

 

 

 

 

이제 로그인을 테스트 해볼 수 있는 기본적인 구성이 갖추어졌다.

그런데 현재 DB가 비어 있으므로 조회할 수 없다. 값을 넣어주는 작업을 반복하기는 번거로우므로 스프링을 시작할 때 자동으로 DB에 값을 넣어주는 작업을 진행하려 한다. 이는 다음 포스팅에 작성한다.

 

Comments