Skip to content

Commit

Permalink
Merge branch 'feature/#13-login' of github.com:f-lab-edu/send-box int…
Browse files Browse the repository at this point in the history
…o feature/#15-encrypt
  • Loading branch information
kamser0415 committed Nov 14, 2024
2 parents b136ab6 + 8dccf81 commit ed94b5c
Show file tree
Hide file tree
Showing 26 changed files with 128 additions and 93 deletions.
3 changes: 0 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ dependencies {
// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// Guava (sha-256)
implementation 'com.google.guava:guava:33.3.1-jre'

}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import shop.sendbox.sendbox.buyer.ApiResponse;

/*
기본적으로 서버에서 발생한 예외는 모두 500 에러로 처리됩니다.
하지만 클라이언트가 잘못된 요청을 보낸 경우 400 에러로 처리를 해야합니다.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package shop.sendbox.sendbox.buyer;
package shop.sendbox.sendbox.api;

import org.springframework.http.HttpStatus;

Expand Down
9 changes: 0 additions & 9 deletions src/main/java/shop/sendbox/sendbox/buyer/BuyerResponse.java

This file was deleted.

5 changes: 0 additions & 5 deletions src/main/java/shop/sendbox/sendbox/buyer/DeleteStatus.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package shop.sendbox.sendbox.buyer;
package shop.sendbox.sendbox.buyer.controller;

import java.time.LocalDateTime;

Expand All @@ -7,6 +7,10 @@
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
import shop.sendbox.sendbox.api.ApiResponse;
import shop.sendbox.sendbox.buyer.service.BuyerResponse;
import shop.sendbox.sendbox.buyer.service.BuyerService;

/*
빈 등록과 해당 클래스가 컨트롤러 역할,그리고 Json 응답을 변환해주는 @RestController 애노테이션을 추가했습니다.
RequiredArgsConstructor는 생성자에 필요한 필수 파라미터가 포함된 생성자를 만들어줍니다.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package shop.sendbox.sendbox.buyer;
package shop.sendbox.sendbox.buyer.controller;

import shop.sendbox.sendbox.buyer.service.BuyerRequest;

public record BuyerCreateRequest(
String email, String password, String name, String phoneNumber,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package shop.sendbox.sendbox.buyer;
package shop.sendbox.sendbox.buyer.entity;

import static shop.sendbox.sendbox.buyer.BuyerStatus.*;
import static shop.sendbox.sendbox.buyer.DeleteStatus.*;
import static shop.sendbox.sendbox.buyer.entity.BuyerStatus.*;
import static shop.sendbox.sendbox.buyer.entity.DeleteStatus.*;
import static shop.sendbox.sendbox.util.HashingEncrypt.*;

import java.time.LocalDateTime;
Expand Down Expand Up @@ -51,7 +51,7 @@ public class Buyer {
별도의 생성자에 빌더 어노테이션을 사용했습니다.
@Builder가 있는 생성자 필드로 빌더 패턴이 적용됩니다.
*/
@Builder
@Builder(access = AccessLevel.PRIVATE)
private Buyer(String email, String password, String salt, String name, String phoneNumber, LocalDateTime createdAt,
String createdBy, DeleteStatus deleteYN, BuyerStatus buyerStatus, Long addressId) {
this.email = email;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package shop.sendbox.sendbox.buyer;
package shop.sendbox.sendbox.buyer.entity;

public enum BuyerStatus {
ACTIVE, SUSPENDED, DELETED,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package shop.sendbox.sendbox.buyer.entity;

public enum DeleteStatus {
Y, N
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package shop.sendbox.sendbox.buyer;
package shop.sendbox.sendbox.buyer.repository;

import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;

import shop.sendbox.sendbox.buyer.entity.Buyer;

public interface BuyerRepository extends JpaRepository<Buyer, Long> {
Optional<Buyer> findByEmail(String email);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package shop.sendbox.sendbox.buyer;
package shop.sendbox.sendbox.buyer.service;

public record BuyerRequest(
String email,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package shop.sendbox.sendbox.buyer.service;

import lombok.AccessLevel;
import lombok.Builder;
import shop.sendbox.sendbox.buyer.entity.Buyer;
import shop.sendbox.sendbox.buyer.entity.BuyerStatus;

// 빌더는 빌더 객체로 사용할 수 있도록 해주는 애노테이션입니다.
@Builder(access = AccessLevel.PRIVATE)
public record BuyerResponse(Long buyerId, String email, String name, String phoneNumber, BuyerStatus buyerStatus) {

public static BuyerResponse of(Buyer buyer) {
return BuyerResponse.builder()
.buyerId(buyer.getBuyerId())
.email(buyer.getEmail())
.name(buyer.getName())
.phoneNumber(buyer.getPhoneNumber())
.buyerStatus(buyer.getBuyerStatus())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
package shop.sendbox.sendbox.buyer;
package shop.sendbox.sendbox.buyer.service;

import java.time.LocalDateTime;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import lombok.RequiredArgsConstructor;
import shop.sendbox.sendbox.buyer.entity.Buyer;
import shop.sendbox.sendbox.buyer.repository.BuyerRepository;
import shop.sendbox.sendbox.login.LoginHandler;
import shop.sendbox.sendbox.login.LoginResponse;
import shop.sendbox.sendbox.login.LoginUser;
import shop.sendbox.sendbox.login.UserType;

// 서비스 클래스임을 명시하고, 컴포넌트 스캔에 포함되기 위한 @Component를 가진 메타 애노테이션을 추가했습니다.
// RequiredArgsConstructor 애노테이션을 사용하여 final 필드를 생성자로 주입받도록 했습니다.
/*
서비스 클래스임을 명시하고, 컴포넌트 스캔에 포함되기 위한 @Component를 가진 메타 애노테이션을 추가했습니다.
RequiredArgsConstructor 애노테이션을 사용하여 final 필드를 생성자로 주입받도록 했습니다.
*/
@Service
@RequiredArgsConstructor
public class BuyerService implements LoginHandler {
Expand Down Expand Up @@ -45,9 +48,9 @@ public boolean supports(final UserType userType) {

@Override
public LoginResponse login(final LoginUser user) {
final Buyer findBuyer = buyerRepository.findByEmail(user.email())
final Buyer foundBuyer = buyerRepository.findByEmail(user.email())
.orElseThrow(() -> new IllegalArgumentException("해당 이메일로 가입된 회원이 없습니다."));
findBuyer.validatePassword(user.password());
return LoginResponse.of(findBuyer);
foundBuyer.validatePassword(user.password());
return LoginResponse.of(foundBuyer);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import shop.sendbox.sendbox.buyer.ApiResponse;
import shop.sendbox.sendbox.api.ApiResponse;

@RestController
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package shop.sendbox.sendbox.login;

import shop.sendbox.sendbox.buyer.Buyer;
import shop.sendbox.sendbox.buyer.entity.Buyer;

public record LoginResponse(
Long id,
Expand Down
18 changes: 12 additions & 6 deletions src/main/java/shop/sendbox/sendbox/util/HashingEncrypt.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
package shop.sendbox.sendbox.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Base64;

import com.google.common.base.Charsets;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;

public class HashingEncrypt {
static final int SALT_LENGTH = 16;

public static String encrypt(String input, String salt) {
final HashCode hashCode = Hashing.sha256().hashString(input + salt, Charsets.UTF_8);
return hashCode.toString();
final MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
digest.update(salt.getBytes());
digest.update(input.getBytes());
return Arrays.toString(digest.digest());
}

public static String generateSalt() {
Expand Down
16 changes: 16 additions & 0 deletions src/main/resources/application-local.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
spring:
config:
activate:
on-profile: local

jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
format_sql: true

h2:
console:
enabled: true
16 changes: 16 additions & 0 deletions src/main/resources/application-test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
spring:
config:
activate:
on-profile: test

jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
format_sql: true

sql:
init:
mode: never
41 changes: 0 additions & 41 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,44 +13,3 @@ spring:
jpa:
hibernate:
ddl-auto: none

server:
servlet:
session:
timeout: 30m

---
spring:
config:
activate:
on-profile: local

jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
format_sql: true

h2:
console:
enabled: true

---
spring:
config:
activate:
on-profile: test

jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
format_sql: true

sql:
init:
mode: never
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,15 @@
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpStatus;

class ApiResponseTest {
import shop.sendbox.sendbox.api.ApiResponse;

class ApiResponseTest {
/**
* @Test 애노테이션 설명
* 해당 애노테이션인 달린 메소드는 테스트 메소드를 나타냅니다.
* 메타 애노테이션으로 사용할 수있으며 커스텀 애노테이션도 작성가능합니다.
* Junit 프레임워크가 동작하여 해당 어노테이션을 찾아 실행합니다.
*/
@Test
@DisplayName("ApiResponse는 응답코드,메세지,데이터를 입력받아 생성한다.")
void create() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@

import com.fasterxml.jackson.databind.ObjectMapper;

import shop.sendbox.sendbox.buyer.controller.BuyerController;
import shop.sendbox.sendbox.buyer.controller.BuyerCreateRequest;
import shop.sendbox.sendbox.buyer.service.BuyerService;

@WebMvcTest(controllers = {
BuyerController.class,
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import shop.sendbox.sendbox.buyer.controller.BuyerCreateRequest;
import shop.sendbox.sendbox.buyer.service.BuyerRequest;

class BuyerCreateRequestTest {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import shop.sendbox.sendbox.buyer.entity.Buyer;
import shop.sendbox.sendbox.buyer.entity.BuyerStatus;
import shop.sendbox.sendbox.buyer.repository.BuyerRepository;
import shop.sendbox.sendbox.buyer.service.BuyerRequest;
import shop.sendbox.sendbox.buyer.service.BuyerResponse;
import shop.sendbox.sendbox.buyer.service.BuyerService;
import shop.sendbox.sendbox.login.LoginUser;
import shop.sendbox.sendbox.login.UserType;

Expand Down
4 changes: 3 additions & 1 deletion src/test/java/shop/sendbox/sendbox/buyer/BuyerTest.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package shop.sendbox.sendbox.buyer;

import static shop.sendbox.sendbox.buyer.BuyerStatus.*;
import static shop.sendbox.sendbox.buyer.entity.BuyerStatus.*;

import java.time.LocalDateTime;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import shop.sendbox.sendbox.buyer.entity.Buyer;

class BuyerTest {
/*
@Test 애노테이션이 붙은 메서드는 테스트 메서드로 인식됩니다.
Expand Down
11 changes: 5 additions & 6 deletions src/test/java/shop/sendbox/sendbox/login/LoginServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,18 @@
import java.time.LocalDateTime;

import org.assertj.core.api.Assertions;
import org.checkerframework.checker.units.qual.A;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.transaction.annotation.Transactional;

import shop.sendbox.sendbox.buyer.Buyer;
import shop.sendbox.sendbox.buyer.BuyerRepository;
import shop.sendbox.sendbox.buyer.BuyerRequest;
import shop.sendbox.sendbox.buyer.BuyerService;
import shop.sendbox.sendbox.buyer.entity.Buyer;
import shop.sendbox.sendbox.buyer.repository.BuyerRepository;
import shop.sendbox.sendbox.buyer.service.BuyerRequest;
import shop.sendbox.sendbox.buyer.service.BuyerService;


@ActiveProfiles("test")
@SpringBootTest
Expand Down

0 comments on commit ed94b5c

Please sign in to comment.