Skip to content

[그리디] 황혜림 Spring Core (배포) 7,8,9 단계 제출합니다. #176

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: hyerimh
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/bin/bash

# 프로젝트 경로 설정
REPOSITORY=/home/ubuntu/app
PROJECT_NAME=spring-basic-roomescape-playground

# 프로젝트 디렉토리로 이동
cd $REPOSITORY/$PROJECT_NAME
echo "> Git Pull"
git pull origin main

echo "> 프로젝트 빌드 시작"
./gradlew clean build

echo "> 빌드 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> 현재 구동 중인 애플리케이션 PID 확인"
CURRENT_PID=$(lsof -i tcp:8080 | awk 'NR!=1 {print $2}' | sort -u)

if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -9 $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 3
fi

echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"

# 애플리케이션 실행
nohup java -jar \
-Dspring.config.location=classpath:/application.yml,/home/ubuntu/app/application-prod.yml \
-Dspring.profiles.active=prod \
$JAR_NAME 2>&1 &
15 changes: 15 additions & 0 deletions src/main/java/jwt/AuthConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package jwt;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(JwtProperties.class)
public class AuthConfig {

@Bean
public JwtUtils jwtUtils(JwtProperties properties) {
return new JwtUtils(properties.secret(), properties.expiration());
}
}
7 changes: 7 additions & 0 deletions src/main/java/jwt/JwtProperties.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package jwt;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "roomescape.auth.jwt")
public record JwtProperties(String secret, long expiration) {
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
package roomescape.auth;
package jwt;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import roomescape.domain.member.Member;

@Component
public class JwtTokenProvider {
public class JwtUtils {

@Value("${roomescape.auth.jwt.secret}")
private String secretKey;
@Value("${roomescape.auth.jwt.expiration}")
private long expirationTime;
private final String secretKey;
private final long expirationTime;

public JwtUtils(String secretKey, long expirationTime) {
this.secretKey = secretKey;
this.expirationTime = expirationTime;
}
public String createToken(Member member) {
return Jwts.builder()
.setSubject(member.getId().toString())
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/roomescape/DataLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package roomescape;

import lombok.RequiredArgsConstructor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import roomescape.domain.member.Member;
import roomescape.domain.member.MemberRepository;

@Component
@Profile("dev")
@RequiredArgsConstructor
public class DataLoader implements CommandLineRunner {

private final MemberRepository memberRepository;


@Override
public void run(String... args) throws Exception {
memberRepository.save(new Member("어드민", "admin@email.com", "password", "ADMIN"));
memberRepository.save(new Member("브라운", "brown@email.com", "password", "USER"));
}
}
2 changes: 2 additions & 0 deletions src/main/java/roomescape/RoomescapeApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"roomescape", "jwt"})
public class RoomescapeApplication {
public static void main(String[] args) {
SpringApplication.run(RoomescapeApplication.class, args);
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/roomescape/auth/AdminAuthInterceptor.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,18 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import roomescape.domain.member.Member;
import roomescape.domain.member.MemberService;
import roomescape.exception.CustomException;

@Component
@RequiredArgsConstructor
public class AdminAuthInterceptor implements HandlerInterceptor {

private final CookieUtil cookieUtil;
private final CookieUtils cookieUtils;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
Cookie[] cookies = request.getCookies();
String token = cookieUtil.extractTokenFromCookies(cookies);
String token = cookieUtils.extractTokenFromCookies(cookies);

if (StringUtils.isBlank(token)) {
throw new CustomException(EMPTY_TOKEN);
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/roomescape/auth/AuthController.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@
public class AuthController {

private final AuthService authService;
private final CookieUtil cookieUtil;
private final CookieUtils cookieUtils;

@PostMapping("/login")
public ResponseEntity<Void> login(@Valid @RequestBody LoginRequest loginRequest,
HttpServletResponse response) {
String token = authService.login(loginRequest);
response.addCookie(cookieUtil.createTokenCookie(token));
response.addCookie(cookieUtils.createTokenCookie(token));
return ResponseEntity.ok().build();
}

Expand All @@ -39,7 +39,7 @@ public ResponseEntity<MemberResponse> checkLogin(HttpServletRequest request,

@PostMapping("/logout")
public ResponseEntity logout(HttpServletResponse response) {
response.addCookie(cookieUtil.createLogoutCookie());
response.addCookie(cookieUtils.createLogoutCookie());
return ResponseEntity.ok().build();
}
}
9 changes: 5 additions & 4 deletions src/main/java/roomescape/auth/AuthInterceptor.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jwt.JwtUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
Expand All @@ -19,20 +20,20 @@
public class AuthInterceptor implements HandlerInterceptor {

private final MemberService memberService;
private final JwtTokenProvider jwtTokenProvider;
private final CookieUtil cookieUtil;
private final JwtUtils jwtUtils;
private final CookieUtils cookieUtils;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
Cookie[] cookies = request.getCookies();
String token = cookieUtil.extractTokenFromCookies(cookies);
String token = cookieUtils.extractTokenFromCookies(cookies);

if (StringUtils.isBlank(token)) {
throw new CustomException(EMPTY_TOKEN);
}

Long memberId = jwtTokenProvider.extractMemberId(token);
Long memberId = jwtUtils.extractMemberId(token);
Member member = memberService.getMemberById(memberId)
.orElseThrow(() -> new CustomException(INVALID_TOKEN));

Expand Down
5 changes: 3 additions & 2 deletions src/main/java/roomescape/auth/AuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static roomescape.exception.ErrorCode.INVALID_EMAILPASSWORD;

import jwt.JwtUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import roomescape.domain.member.Member;
Expand All @@ -13,11 +14,11 @@
public class AuthService {

private final MemberRepository memberRepository;
private final JwtTokenProvider jwtTokenProvider;
private final JwtUtils jwtUtils;

public String login(LoginRequest loginRequest) {
Member member = memberRepository.findByEmailAndPassword(loginRequest.email(), loginRequest.password())
.orElseThrow(() -> new CustomException(INVALID_EMAILPASSWORD));
return jwtTokenProvider.createToken(member);
return jwtUtils.createToken(member);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
import org.springframework.stereotype.Component;

@Component
public class CookieUtil {
public class CookieUtils {

private final String cookieName;

public CookieUtil(@Value("${roomescape.auth.cookie.name:token}") String cookieName) {
public CookieUtils(@Value("${roomescape.auth.cookie.name:token}") String cookieName) {
this.cookieName = cookieName;
}

Expand Down
16 changes: 16 additions & 0 deletions src/main/resources/application-dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
spring:
h2:
console:
enabled: true
path: /h2-console
datasource:
url: jdbc:h2:mem:database
driver-class-name: org.h2.Driver
jpa:
ddl-auto: create-drop
defer-datasource-initialization: true
roomescape:
auth:
jwt:
secret: Yn2kjibddFAWtnPJ2AFlL8WXmohJMCvigQggaEypa5E=
expiration: 300000
15 changes: 15 additions & 0 deletions src/main/resources/application-prod.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
spring:
h2:
console:
enabled: false
datasource:
url: jdbc:h2:mem:database
driver-class-name: org.h2.Driver
jpa:
ddl-auto: update
defer-datasource-initialization: false
roomescape:
auth:
jwt:
secret: Yn2kjibddFAWtnPJ2AFlL8WXmohJMCvigQggaEypa5E=
expiration: 3600000
16 changes: 16 additions & 0 deletions src/main/resources/application-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
spring:
h2:
console:
enabled: true
path: /h2-console
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
jpa:
ddl-auto: create-drop
defer-datasource-initialization: true
roomescape:
auth:
jwt:
secret: Yn2kjibddFAWtnPJ2AFlL8WXmohJMCvigQggaEypa5E=
expiration: 300000
15 changes: 0 additions & 15 deletions src/main/resources/application.properties

This file was deleted.

14 changes: 14 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
spring:
sql:
init:
encoding: utf-8
jpa:
open-in-view: false
show-sql: true
properties:
hibernate:
format_sql: true
roomescape:
auth:
cookie:
name: token
24 changes: 0 additions & 24 deletions src/main/resources/schema.sql

This file was deleted.

2 changes: 2 additions & 0 deletions src/test/java/roomescape/JpaTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import roomescape.domain.member.MemberRepository;
import roomescape.domain.reservation.ReservationRepository;
import roomescape.domain.theme.ThemeRepository;
import roomescape.domain.time.Time;
import roomescape.domain.time.TimeRepository;

@ActiveProfiles("test")
@DataJpaTest
@ContextConfiguration(classes = {TimeRepository.class, ReservationRepository.class, MemberRepository.class,
ThemeRepository.class, RoomescapeApplication.class})
Expand Down
Loading