1. 개발환경 (프로젝트 생성)
- Project : Gradle - Groovy
- Language : Java
- Spring Boot : 3.3.1
- Project Metadata
* Group : com.example
* Artifact / Name : auth
* Packaging : Jar
* Java : 17
- Dependencies
* Spring Web
* Spring Data JPA
* Spring Security
* H2 Database
* Lombok
위와 같이 설정 후 프로젝트를 생성한다.
2. 기능 구현
build.gradle 설정
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.1'
id 'io.spring.dependency-management' version '1.1.5'
}
group = 'com.example.'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
프로젝트를 생성하고 수정된 부분 없다.
Entity 생성
<Member.java>
package com.example.auth.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Entity
@Getter
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String memberId;
private String password;
}
Member 객체는 간단하게 memberId와 password만 가지도록 했다.
Repository 생성
<MemberRepository.java>
package com.example.auth.repository;
import com.example.auth.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findByMemberId(String memberId);
}
memberId로 Member를 찾는 findByMemberId 메서드를 선언해준다.
(findByOOO 해당 문법은 Spring data JPA에 대해 공부해야함)
DTO 생성
<LoginRequest.java>
package com.example.auth.dto;
import lombok.Data;
@Data
public class LoginRequest {
private String id;
private String pw;
}
사용자에게 입력받는 LoginRequest DTO를 생성한다.
Service 생성
<MemberService.java>
package com.example.auth.service;
import com.example.auth.dto.LoginRequest;
import com.example.auth.entity.Member;
import com.example.auth.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class MemberService {
@Autowired MemberRepository memberRepository;
public boolean validateMember(LoginRequest loginRequest) {
Member member = memberRepository.findByMemberId(loginRequest.getId())
.orElseThrow(() -> new UsernameNotFoundException("User not found with id: " + loginRequest.getId()));
return member.getPassword().equals(loginRequest.getPw());
}
}
비밀번호가 일치한지 확인 후 true or false를 반환한다.
Config 생성
<SecurityConfig.java>
package com.example.auth.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/login").permitAll()
.anyRequest().authenticated()
)
.formLogin(login -> login.disable());
return http.build();
}
}
Controller생성
<MemberController.java>
package com.example.auth.controller;
import com.example.auth.dto.LoginRequest;
import com.example.auth.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MemberController {
@Autowired
MemberService memberService;
@PostMapping("/login")
public String login(@RequestBody LoginRequest loginRequest) {
boolean validated = memberService.validateMember(loginRequest);
return validated ? "success" : "fail";
}
}
Post방식 호출, 성공 시 "success" 실패 시 "fail"이 반환된다.
application.yml 설정
<application.yml>
spring:
application:
name: auth
datasource:
url: jdbc:h2:tcp://localhost/~/auth
username: sa
password: 1
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
# show_sql: true
format_sql: true
logging.level:
org.hibernate.SQL: debug
# org.hibernate.type: trace
application.properties 파일보단 yml이 가독성이 좋아서 난 이걸로 쓰고있다.
3. 검증 (API 호출 확인)
검증 전, Member 테이블에 데이터를 넣어주어야 한다.
H2 데이터베이스에 접속해서 다음 SQL문을 입력해서 데이터를 넣어주자.
INSERT INTO member(user_id, password) VALUES ('admin', '1234');
다음 Postman으로 API 호출해서 정상적으로 작동하는지 확인하자.
작성한 소스코드를 Run시켜주어 서버를 켜주고, Postman을 켠다.
- URL : http://localhost:8080/login
- Method : POST
- Body : raw, JSON 형식 {"id": "admin", "pw": "1234"}
위 사진처럼 success가 반환된다면, 정상적으로 동작한 것이다.
아주 간단하게 로그인 API 서버를 만들어 보았으며, 다음 포스팅에서는 비밀번호를 암호화해서 저장하는 방법을 알아보겠다.
+ 중간에 막히는 부분이나 잘못된 부분이 있으면 댓글 달아주시면 바로 수정 또는 답변 드리겠습니다.
'백엔드 개발 > Spring&JPA' 카테고리의 다른 글
[Spring Data JPA] 로그인 기능 구현(3) - JWT 적용 (0) | 2024.06.28 |
---|---|
[Spring Data JPA] 로그인 기능 구현(2) - Password Encode (0) | 2024.06.25 |
좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2023.03.09 |
스프링 빈과 의존관계 (0) | 2023.03.02 |
spring 개발 기초 방식 3가지 (0) | 2023.03.01 |