ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,80 @@
+package christmas.service;
+
+import static christmas.constants.event.EventRule.EVENT_THRESHOLD;
+import static christmas.constants.event.EventType.CHRISTMAS;
+import static christmas.constants.event.EventType.PRESENT;
+import static christmas.constants.event.EventType.SPECIAL;
+import static christmas.constants.event.EventType.WEEKDAY;
+import static christmas.constants.event.EventType.WEEKEND;
+
+import christmas.constants.event.EventType;
+import christmas.dto.EventDetail;
+import christmas.dto.UserOrder;
+import christmas.model.ChristmasEvent;
+import christmas.model.Eventable;
+import christmas.model.PresentEvent;
+import christmas.model.SpecialEvent;
+import christmas.model.WeekdayEvent;
+import christmas.model.WeekendEvent;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+
+public class EventService {
+    private final Map<EventType, Eventable> eventResult;
+    private final int INVALID_VALUE = 0;
+
+    public EventService() {
+        eventResult = new EnumMap<>(EventType.class);
+    }
+
+    public void applyEvent(UserOrder userOrder) {
+        if (!canJoinEvent(userOrder.orderPrice())) {
+            userOrder = new UserOrder(INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE);
+        }
+
+        eventResult.put(PRESENT, PresentEvent.create(userOrder.orderPrice()));
+        eventResult.put(CHRISTMAS, ChristmasEvent.create(userOrder.date()));
+        eventResult.put(WEEKDAY, WeekdayEvent.create(userOrder));
+        eventResult.put(WEEKEND, WeekendEvent.create(userOrder));
+        eventResult.put(SPECIAL, SpecialEvent.create(userOrder.date()));
+    }
+
+    private boolean canJoinEvent(int orderPrice) {
+        if (orderPrice < EVENT_THRESHOLD.getValue()) {
+            return false;
+        }
+        return true;
+    }
+
+    public int getDiscountPriceByEvent(EventType eventType) {
+        return eventResult.get(eventType).getDiscountPrice();
+    }
+
+    public int getExpectedPrice(UserOrder userOrder) {
+        return userOrder.orderPrice() - getTotalDiscountPrice();
+    }
+
+    public int getTotalDiscountPrice() {
+        return eventResult.entrySet()
+                .stream()
+                .filter(entry -> entry.getKey() != PRESENT)
+                .mapToInt(value -> value.getValue().getDiscountPrice())
+                .sum();
+    }
+
+    public int getTotalBenefitPrice() {
+        return eventResult.values()
+                .stream()
+                .mapToInt(Eventable::getDiscountPrice)
+                .sum();
+    }
+    
+    public List<EventDetail> convertToEventDetails() {
+        return eventResult.entrySet()
+                .stream()
+                .filter(entry -> entry.getValue().getDiscountPrice() != 0)
+                .map(entry -> new EventDetail(entry.getKey(), entry.getValue().getDiscountPrice()))
+                .toList();
+    }
+}

리뷰: 이벤트가 추가될 때마다 put을 해야하는 불편함이 있을 것 같습니다
@@ -0,0 +1,97 @@
+package christmas.config;
+
+import christmas.controller.EventController;
+import christmas.exception.RetryHandler;
+import christmas.service.EventService;
+import christmas.service.MenuService;
+import christmas.validator.InputValidator;
+import christmas.view.input.ConsoleReader;
+import christmas.view.input.InputView;
+import christmas.view.input.Reader;
+import christmas.view.output.ConsoleWriter;
+import christmas.view.output.OutputView;
+import christmas.view.output.Writer;
+
+public class AppConfig {
+    private static AppConfig appConfig;
+    private EventController eventController;
+    private EventService eventService;
+    private MenuService menuService;
+    private InputValidator inputValidator;
+    private RetryHandler retryHandler;
+    private InputView inputView;
+    private OutputView outputView;
+    private Reader reader;
+    private Writer writer;
+
+    public static AppConfig getInstance() {
+        if (appConfig == null) {
+            appConfig = new AppConfig();
+        }
+        return appConfig;
+    }
+
+    public EventController eventController() {
+        if (eventController == null) {
+            eventController = new EventController(discountService(), menuService(),
+                    inputView(), outputView(), exceptionHandler());
+        }
+        return eventController;
+    }
+
+    public EventService discountService() {
+        if (eventService == null) {
+            eventService = new EventService();
+        }
+        return eventService;
+    }
+
+    public MenuService menuService() {
+        if (menuService == null) {
+            menuService = new MenuService();
+        }
+        return menuService;
+    }
+
+    public RetryHandler exceptionHandler() {
+        if (retryHandler == null) {
+            retryHandler = new RetryHandler(outputView());
+        }
+        return retryHandler;
+    }
+
+    public InputView inputView() {
+        if (inputView == null) {
+            inputView = new InputView(reader(), inputValidator());
+        }
+        return inputView;
+    }
+
+    public InputValidator inputValidator() {
+        if (inputValidator == null) {
+            inputValidator = new InputValidator();
+        }
+        return inputValidator;
+    }
+
+    public Reader reader() {
+        if (reader == null) {
+            reader = new ConsoleReader();
+        }
+        return reader;
+    }
+
+    public OutputView outputView() {
+        if (outputView == null) {
+            outputView = new OutputView(writer());
+        }
+        return outputView;
+    }
+
+    public Writer writer() {
+        if (writer == null) {
+            writer = new ConsoleWriter();
+        }
+        return writer;
+    }
+}

리뷰: outview의 경우 static메서드를 활용해 객체를 생성하지 않는 방법도 있는데, 그럼에도 싱글톤 패턴을 유지하신 이유가 있을까요?
@@ -0,0 +1,25 @@
+package christmas.constants.event;
+
+public enum EventRule {
+    EVENT_THRESHOLD(10_000),
+    PRESENT_THRESHOLD(120_000),
+    EVENT_START(1),
+    EVENT_END(31),
+    MAX_MENU_AMOUNT(20),
+    CHRISTMAS_EVENT_END(25),
+    CHRISTMAS_INIT_PRICE(1_000),
+    CHRISTMAS_EXTRA_DISCOUNT(100),
+    MENU_DISCOUNT(2_023),
+    SPECIAL_DISCOUNT(1_000);
+
+
+    private final int value;
+
+    EventRule(int value) {
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+}

리뷰: 개인적으로 enum은 연관된 상수를 모아두는 곳이라고 생각합니다!
    CHRISTMAS_EXTRA_DISCOUNT(100),
    MENU_DISCOUNT(2_023), 
등은 서로 다른 객체단위로 분리가 가능해보여요!

차라리 객체 내부의 상수 필드로 관리하는 것은 어떠세요?
@@ -0,0 +1,24 @@
+package com.requestrealpiano.songrequest.controller;
+
+import com.requestrealpiano.songrequest.service.AccountService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/api/accounts")
+public class AccountController {
+
+    private final AccountService accountService;
+
+    @GetMapping("/auth")
+    public ResponseEntity<Void> generateToken(@RequestHeader HttpHeaders httpHeaders) {
+        String jwtToken = accountService.generateJwtToken(httpHeaders.getFirst(HttpHeaders.AUTHORIZATION));
+        HttpHeaders responseHeaders = new HttpHeaders();
+        responseHeaders.add(HttpHeaders.AUTHORIZATION, jwtToken);
+        return new ResponseEntity<>(responseHeaders, HttpStatus.NO_CONTENT);
+    }
+}

리뷰: 다른 컨트롤러에서는 ResponseStatus로 지정했는데 여긴 ResponseEntity로 지정했군요 어떤 이유로 지정했는지 궁금합니다.
@@ -2,18 +2,18 @@
 
 import com.requestrealpiano.songrequest.domain.song.searchapi.response.SearchApiResponse;
 import com.requestrealpiano.songrequest.global.response.ApiResponse;
+import com.requestrealpiano.songrequest.global.response.StatusCode;
 import com.requestrealpiano.songrequest.service.SongService;
 import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.validation.constraints.Size;
 
 import static com.requestrealpiano.songrequest.global.constant.ValidationCondition.*;
-import static com.requestrealpiano.songrequest.global.response.ApiResponse.OK;
+import static com.requestrealpiano.songrequest.global.response.ApiResponse.SUCCESS;
+import static com.requestrealpiano.songrequest.global.response.StatusCode.OK;
 
 @RequiredArgsConstructor
 @Validated
@@ -23,12 +23,13 @@ public class SongController {
 
     private final SongService songService;
 
+    @ResponseStatus(HttpStatus.OK)
     @GetMapping
     public ApiResponse<SearchApiResponse> search(@RequestParam(defaultValue = "artist") @Size(max = ARTIST_MAX)
                                                  String artist,
                                                  @RequestParam(defaultValue = "title") @Size(max = TITLE_MAX)
                                                  String title) {
         SearchApiResponse searchApiResponse = songService.searchSong(artist, title);
-        return OK(searchApiResponse);
+        return SUCCESS(OK, searchApiResponse);
     }
 }

리뷰: 이 부분은 컨트롤러에서 Validation을 잡기보단 Validation DTO를 생성해서 해당 객체에서 관리하면 더욱 편리하고 보기가 좋을듯 합니다.
@@ -1,5 +1,6 @@
 package com.requestrealpiano.songrequest.domain.account;
 
+import com.requestrealpiano.songrequest.security.oauth.OAuthAttributes;
 import com.requestrealpiano.songrequest.domain.base.BaseTimeEntity;
 import com.requestrealpiano.songrequest.domain.letter.Letter;
 import lombok.AccessLevel;
@@ -8,9 +9,6 @@
 import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -25,7 +23,7 @@ public class Account extends BaseTimeEntity {
     private Long id;
 
     @Column(name = "google_oauth_id")
-    private Long googleOauthId;
+    private String googleOauthId;
 
     private String name;
 
@@ -44,12 +42,36 @@ public class Account extends BaseTimeEntity {
     private List<Letter> letters = new ArrayList<>();
 
     @Builder
-    private Account(Long googleOauthId, String name, String email, Role role, String avatarUrl, Integer requestCount) {
+    private Account(String googleOauthId, String name, String email, Role role, String avatarUrl, Integer requestCount) {
         this.googleOauthId = googleOauthId;
         this.name = name;
         this.email = email;
         this.role = role;
         this.avatarUrl = avatarUrl;
         this.requestCount = requestCount;
     }
+
+    public String getRoleKey() { return role.getKey(); }
+
+    public String getRoleValue() {
+        return role.getValue();
+    }
+
+    public Account updateProfile(OAuthAttributes attributes) {
+        this.name = attributes.getName();
+        this.email = attributes.getEmail();
+        this.avatarUrl = attributes.getAvatarUrl();
+        return this;
+    }
+
+    public static Account from(OAuthAttributes oAuthAttributes) {
+        return Account.builder()
+                      .googleOauthId(oAuthAttributes.getGoogleOauthId())
+                      .name(oAuthAttributes.getName())
+                      .email(oAuthAttributes.getEmail())
+                      .role(Role.MEMBER)
+                      .avatarUrl(oAuthAttributes.getAvatarUrl())
+                      .requestCount(0)
+                      .build();
+    }
 }

리뷰: 엌ㅋㅋㅋㅋ OAuthId를 확인하시고 바꾸셨군요.
@@ -1,5 +1,6 @@
 package com.requestrealpiano.songrequest.domain.account;
 
+import com.requestrealpiano.songrequest.security.oauth.OAuthAttributes;
 import com.requestrealpiano.songrequest.domain.base.BaseTimeEntity;
 import com.requestrealpiano.songrequest.domain.letter.Letter;
 import lombok.AccessLevel;
@@ -8,9 +9,6 @@
 import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -25,7 +23,7 @@ public class Account extends BaseTimeEntity {
     private Long id;
 
     @Column(name = "google_oauth_id")
-    private Long googleOauthId;
+    private String googleOauthId;
 
     private String name;
 
@@ -44,12 +42,36 @@ public class Account extends BaseTimeEntity {
     private List<Letter> letters = new ArrayList<>();
 
     @Builder
-    private Account(Long googleOauthId, String name, String email, Role role, String avatarUrl, Integer requestCount) {
+    private Account(String googleOauthId, String name, String email, Role role, String avatarUrl, Integer requestCount) {
         this.googleOauthId = googleOauthId;
         this.name = name;
         this.email = email;
         this.role = role;
         this.avatarUrl = avatarUrl;
         this.requestCount = requestCount;
     }
+
+    public String getRoleKey() { return role.getKey(); }
+
+    public String getRoleValue() {
+        return role.getValue();
+    }
+
+    public Account updateProfile(OAuthAttributes attributes) {
+        this.name = attributes.getName();
+        this.email = attributes.getEmail();
+        this.avatarUrl = attributes.getAvatarUrl();
+        return this;
+    }
+
+    public static Account from(OAuthAttributes oAuthAttributes) {
+        return Account.builder()
+                      .googleOauthId(oAuthAttributes.getGoogleOauthId())
+                      .name(oAuthAttributes.getName())
+                      .email(oAuthAttributes.getEmail())
+                      .role(Role.MEMBER)
+                      .avatarUrl(oAuthAttributes.getAvatarUrl())
+                      .requestCount(0)
+                      .build();
+    }
 }

리뷰: 여기 적혀있는 MaginNumber 0은 어떤의미인가요?
@@ -11,6 +11,12 @@ public enum ErrorCode {
     METHOD_NOT_ALLOWED(405, "지원하지 않는 요청 메소드 입니다."),
     INTERNAL_SERVER_ERROR(500, "서버에서 요청을 처리하지 못했습니다."),
 
+    // Auth
+    UNAUTHENTICATED_ERROR(401, "인증이 필요합니다. 로그인 이후 다시 시도 해주세요."),
+    JWT_INVALID_ERROR(400, "올바른 인증 정보가 아닙니다. 다시 로그인 해주세요."),
+    JWT_EXPIRATION_ERROR(401, "인증 정보가 만료 되었습니다. 다시 로그인 해주세요."),
+    ACCESS_DENIED_ERROR(403, "해당 요청에 대한 접근 권한이 없습니다."),
+
     // Account
     ACCOUNT_NOT_FOUND(404, "해당 계정이 존재하지 않습니다."),
 

리뷰: 여기서 JWT 인증할 때 두가지 조건이 있더군요. 
1. JWT가 아닌 Token을 사용할 경우 - 400
2. JWT는 맞는데 올바른 JWT가 아닐 경우 - 401

두가지 고려하시는건 어떠신지 랙돌 의견이 궁금합니다.
@@ -11,6 +11,12 @@ public enum ErrorCode {
     METHOD_NOT_ALLOWED(405, "지원하지 않는 요청 메소드 입니다."),
     INTERNAL_SERVER_ERROR(500, "서버에서 요청을 처리하지 못했습니다."),
 
+    // Auth
+    UNAUTHENTICATED_ERROR(401, "인증이 필요합니다. 로그인 이후 다시 시도 해주세요."),
+    JWT_INVALID_ERROR(400, "올바른 인증 정보가 아닙니다. 다시 로그인 해주세요."),
+    JWT_EXPIRATION_ERROR(401, "인증 정보가 만료 되었습니다. 다시 로그인 해주세요."),
+    ACCESS_DENIED_ERROR(403, "해당 요청에 대한 접근 권한이 없습니다."),
+
     // Account
     ACCOUNT_NOT_FOUND(404, "해당 계정이 존재하지 않습니다."),
 

리뷰: 여기서도 이야기 하고 싶은것이 있습니다. 해당 API를 사용할 때 권한을 막는 것이 403이지만 만약 비공개된 정보를 API를 사용하여 가져올때는 404로 Not Found로 띄워야한다고 하더군요. 
그에 대한 대비책도 필요해 보입니다.
@@ -0,0 +1,21 @@
+package com.requestrealpiano.songrequest.security.jwt;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.ConstructorBinding;
+
+@RequiredArgsConstructor
+@Getter
+@ConstructorBinding
+@ConfigurationProperties(prefix = "jwt")
+public class JwtProperties {
+
+    private final String tokenSecret;
+    private final String tokenExpiration;
+    private final String header;
+    private final String headerPrefix;
+    private final String tokenUrl;
+    private final String generationKeySecret;
+    private final String generationKeyExpiration;
+}

리뷰: 생성자가 필요한가요? 불필요한 생성자같아요
@@ -0,0 +1,33 @@
+package com.requestrealpiano.songrequest.security.oauth;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.requestrealpiano.songrequest.global.error.response.ErrorCode;
+import com.requestrealpiano.songrequest.global.error.response.ErrorResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@RequiredArgsConstructor
+@Component
+public class CustomAccessDeniedHandler implements AccessDeniedHandler {
+
+    private final ObjectMapper objectMapper;
+
+    @Override
+    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
+        ErrorCode accessDeniedError = ErrorCode.ACCESS_DENIED_ERROR;
+        String errorResponse = objectMapper.writeValueAsString(ErrorResponse.from(accessDeniedError));
+        response.getWriter().print(errorResponse);
+        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
+        response.setStatus(accessDeniedError.getStatusCode());
+        response.getWriter().flush();
+        response.getWriter().close();
+    }
+}

리뷰: 이정도 길어지면 throws부터 한칸 내려서 보기 쉽게 해주세용
@@ -0,0 +1,33 @@
+package com.requestrealpiano.songrequest.security.oauth;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.requestrealpiano.songrequest.global.error.response.ErrorCode;
+import com.requestrealpiano.songrequest.global.error.response.ErrorResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@RequiredArgsConstructor
+@Component
+public class CustomAccessDeniedHandler implements AccessDeniedHandler {
+
+    private final ObjectMapper objectMapper;
+
+    @Override
+    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
+        ErrorCode accessDeniedError = ErrorCode.ACCESS_DENIED_ERROR;
+        String errorResponse = objectMapper.writeValueAsString(ErrorResponse.from(accessDeniedError));
+        response.getWriter().print(errorResponse);
+        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
+        response.setStatus(accessDeniedError.getStatusCode());
+        response.getWriter().flush();
+        response.getWriter().close();
+    }
+}

리뷰: 여기서 궁금한게 이대로 사용했을 때 에러처리는 발생이 잘 되겠으나 스프링 로그에도 찍히는 지 궁금합니다.
제가 이전 코드스쿼드 도서관 프로젝트에서도 이런식으로 처리했을 때 로그에 찍히지 않는 사소한 문제점이 생겼습니다.
@@ -0,0 +1,33 @@
+package com.requestrealpiano.songrequest.security.oauth;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.requestrealpiano.songrequest.global.error.response.ErrorCode;
+import com.requestrealpiano.songrequest.global.error.response.ErrorResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@RequiredArgsConstructor
+@Component
+public class CustomAccessDeniedHandler implements AccessDeniedHandler {
+
+    private final ObjectMapper objectMapper;
+
+    @Override
+    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
+        ErrorCode accessDeniedError = ErrorCode.ACCESS_DENIED_ERROR;
+        String errorResponse = objectMapper.writeValueAsString(ErrorResponse.from(accessDeniedError));
+        response.getWriter().print(errorResponse);
+        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
+        response.setStatus(accessDeniedError.getStatusCode());
+        response.getWriter().flush();
+        response.getWriter().close();
+    }
+}

리뷰: 그래서 생각해낸 것이 `AccessDeniedException`을 받는 에러클래스를 만들고 해당 에러를 상속받아 여기서 에러가 발생하면 해당 클래스를 호출하는 방식을 사용하여 다른 exceptionHandler처럼 한번에 관리하기도 편하고 로그도 찍힐 수 있다고 생각했습니다.

```java
@Component("restAuthenticationEntryPoint")
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Autowired
    private HandlerExceptionResolver resolver;

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        resolver.resolveException(request, response, null, exception);
    }
}
```
@@ -0,0 +1,14 @@
+package com.requestrealpiano.songrequest.security.oauth;
+
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+@AuthenticationPrincipal
+public @interface LoginAccount {
+}

리뷰: 이것만 달아도 GlobalAdvice 설정을 할 필요가 없어서 좋죠!
@@ -0,0 +1,24 @@
+package com.requestrealpiano.songrequest.controller;
+
+import com.requestrealpiano.songrequest.service.AccountService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/api/accounts")
+public class AccountController {
+
+    private final AccountService accountService;
+
+    @GetMapping("/auth")
+    public ResponseEntity<Void> generateToken(@RequestHeader HttpHeaders httpHeaders) {
+        String jwtToken = accountService.generateJwtToken(httpHeaders.getFirst(HttpHeaders.AUTHORIZATION));
+        HttpHeaders responseHeaders = new HttpHeaders();
+        responseHeaders.add(HttpHeaders.AUTHORIZATION, jwtToken);
+        return new ResponseEntity<>(responseHeaders, HttpStatus.NO_CONTENT);
+    }
+}

리뷰: 분명 모든 컨트롤러를 동시에 수정을 했을텐데 여기는 상태코드만 바꾸고 형식은 이렇게 남겨 두었었네요.
통일성을 위해 수정 하겠습니다ㅎㅎ