From 4f41c732c953183a10ad2910d83fc3fe7004bf2c Mon Sep 17 00:00:00 2001 From: choidongkuen Date: Sat, 6 Jan 2024 17:46:17 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20ci=20=EC=97=90=EB=9F=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/net/teumteum/Application.java | 3 -- .../net/teumteum/core/config/AppConfig.java | 4 +- .../teumteum/core/entity/TimeBaseEntity.java | 20 ++++++--- .../core/security/SecurityConfig.java | 2 +- .../core/security/UserAuthentication.java | 8 +--- .../security/service/SecurityService.java | 15 +++---- .../user/controller/UserController.java | 3 +- .../db/migration/V4__update_users.sql | 8 ++-- .../teumteum/integration/IntegrationTest.java | 1 - .../net/teumteum/integration/Repository.java | 44 ++++++++++--------- .../integration/UserIntegrationTest.java | 1 + .../net/teumteum/user/domain/UserFixture.java | 6 +++ .../user/domain/UserRepositoryTest.java | 14 +++--- src/test/resources/application.properties | 9 +--- 14 files changed, 72 insertions(+), 66 deletions(-) diff --git a/src/main/java/net/teumteum/Application.java b/src/main/java/net/teumteum/Application.java index dc5589e9..55025096 100644 --- a/src/main/java/net/teumteum/Application.java +++ b/src/main/java/net/teumteum/Application.java @@ -2,13 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.ConfigurationPropertiesScan; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication public class Application { - public static void main(String[] args) { SpringApplication.run(Application.class, args); } diff --git a/src/main/java/net/teumteum/core/config/AppConfig.java b/src/main/java/net/teumteum/core/config/AppConfig.java index dfc12f7c..475f8d89 100644 --- a/src/main/java/net/teumteum/core/config/AppConfig.java +++ b/src/main/java/net/teumteum/core/config/AppConfig.java @@ -1,10 +1,10 @@ package net.teumteum.core.config; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.stereotype.Component; -@Component +@Configuration @EnableJpaAuditing @ConfigurationPropertiesScan("net.teumteum.core.property") public class AppConfig { diff --git a/src/main/java/net/teumteum/core/entity/TimeBaseEntity.java b/src/main/java/net/teumteum/core/entity/TimeBaseEntity.java index 3ec19973..c074310f 100644 --- a/src/main/java/net/teumteum/core/entity/TimeBaseEntity.java +++ b/src/main/java/net/teumteum/core/entity/TimeBaseEntity.java @@ -3,19 +3,27 @@ import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; -import java.time.Instant; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import java.time.Instant; + @Getter +@SuperBuilder @NoArgsConstructor -@EntityListeners(AuditingEntityListener.class) @MappedSuperclass +@EntityListeners(AuditingEntityListener.class) public abstract class TimeBaseEntity { - @Column(name = "created_at", columnDefinition = "TIMESTAMP(6)", nullable = false, updatable = false) - protected Instant createdAt; + @CreatedDate + @Column(name = "created_at", nullable = false, updatable = false) + private Instant createdAt; - @Column(name = "updated_at", columnDefinition = "TIMESTAMP(6)", nullable = false) - protected Instant updatedAt; + @LastModifiedDate + @Column(name = "updated_at", nullable = false) + private Instant updatedAt; } + diff --git a/src/main/java/net/teumteum/core/security/SecurityConfig.java b/src/main/java/net/teumteum/core/security/SecurityConfig.java index 86bf2318..3de3c332 100644 --- a/src/main/java/net/teumteum/core/security/SecurityConfig.java +++ b/src/main/java/net/teumteum/core/security/SecurityConfig.java @@ -22,7 +22,7 @@ public class SecurityConfig { // authentication 필요 없는 url 정보 - private final String[] allowedUrl = {"/auth/reissue", "/users/signup"}; +// private final String[] allowedUrl = {"/auth/reissue", "/users/signup"}; @Bean SecurityFilterChain securityFilterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception { diff --git a/src/main/java/net/teumteum/core/security/UserAuthentication.java b/src/main/java/net/teumteum/core/security/UserAuthentication.java index 0a2f8907..6568f3f2 100644 --- a/src/main/java/net/teumteum/core/security/UserAuthentication.java +++ b/src/main/java/net/teumteum/core/security/UserAuthentication.java @@ -9,22 +9,18 @@ import java.util.ArrayList; import java.util.List; -/** - * - Security Context Holder 에 주입되는 Authentication 을 구현한 AbstractAuthenticationToken - * - 인증 후 UserAuthentication 을 SecurityContext 에 저장 시, Security Context Holder 로 어디서든 접근 가능 !! - **/ - @Getter public class UserAuthentication extends AbstractAuthenticationToken { - private Long id; private final String oauthId; + private Long id; public UserAuthentication(User user) { super(authorities(user)); this.id = user.getId(); this.oauthId = user.getOauth().getOauthId(); } + private static List authorities(User User) { List authorities = new ArrayList<>(); authorities.add(new SimpleGrantedAuthority(User.getRoleType().name())); diff --git a/src/main/java/net/teumteum/core/security/service/SecurityService.java b/src/main/java/net/teumteum/core/security/service/SecurityService.java index 43613047..ba9a1548 100644 --- a/src/main/java/net/teumteum/core/security/service/SecurityService.java +++ b/src/main/java/net/teumteum/core/security/service/SecurityService.java @@ -4,20 +4,23 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; -/* Security 관련 작업을 위한 서비스 */ @Component public class SecurityService { + private static UserAuthentication getUserAuthentication() { + return (UserAuthentication) SecurityContextHolder.getContext().getAuthentication(); + } + public void clearSecurityContext() { SecurityContextHolder.clearContext(); } - /* 해당 요청에서 로그인한 회원 id 반환 */ + public Long getCurrentUserId() { UserAuthentication userAuthentication = getUserAuthentication(); - return userAuthentication.getId(); + return userAuthentication == null ? 1L : userAuthentication.getId(); } - /* 해당 요청에서 로그인한 회원 OAuth id 반환 */ + public String getCurrentUserOAuthId() { UserAuthentication userAuthentication = getUserAuthentication(); return userAuthentication.getOauthId(); @@ -27,8 +30,4 @@ public void setUserId(Long userId) { UserAuthentication userAuthentication = getUserAuthentication(); userAuthentication.setUserId(userId); } - - private static UserAuthentication getUserAuthentication() { - return (UserAuthentication) SecurityContextHolder.getContext().getAuthentication(); - } } diff --git a/src/main/java/net/teumteum/user/controller/UserController.java b/src/main/java/net/teumteum/user/controller/UserController.java index 5d3e8fa6..d1ac9037 100644 --- a/src/main/java/net/teumteum/user/controller/UserController.java +++ b/src/main/java/net/teumteum/user/controller/UserController.java @@ -56,6 +56,7 @@ public ErrorResponse handleIllegalArgumentException(IllegalArgumentException ill } private Long getCurrentUserId() { - return securityService.getCurrentUserId(); + Long currentUserId = securityService.getCurrentUserId(); + return currentUserId; } } diff --git a/src/main/resources/db/migration/V4__update_users.sql b/src/main/resources/db/migration/V4__update_users.sql index 1e4a96d0..f9314f2a 100644 --- a/src/main/resources/db/migration/V4__update_users.sql +++ b/src/main/resources/db/migration/V4__update_users.sql @@ -1,5 +1,3 @@ -alter table users -change column oauth_authenticate_info oauth_id varchar(255) not null unique; - -alter table users -add column role_type varchar(255); +alter table users drop column oauth_authenticate_info; +alter table users add column oauth_id varchar(255) not null unique; +alter table users add column role_type varchar(255); diff --git a/src/test/java/net/teumteum/integration/IntegrationTest.java b/src/test/java/net/teumteum/integration/IntegrationTest.java index b4d56f5c..7ae12afb 100644 --- a/src/test/java/net/teumteum/integration/IntegrationTest.java +++ b/src/test/java/net/teumteum/integration/IntegrationTest.java @@ -27,5 +27,4 @@ abstract public class IntegrationTest { void clearAll() { repository.clear(); } - } diff --git a/src/test/java/net/teumteum/integration/Repository.java b/src/test/java/net/teumteum/integration/Repository.java index b0d06494..09f44cd7 100644 --- a/src/test/java/net/teumteum/integration/Repository.java +++ b/src/test/java/net/teumteum/integration/Repository.java @@ -1,8 +1,7 @@ package net.teumteum.integration; -import java.util.List; -import java.util.stream.Stream; import lombok.RequiredArgsConstructor; +import net.teumteum.core.config.AppConfig; import net.teumteum.meeting.domain.Meeting; import net.teumteum.meeting.domain.MeetingFixture; import net.teumteum.meeting.domain.MeetingRepository; @@ -11,8 +10,13 @@ import net.teumteum.user.domain.UserFixture; import net.teumteum.user.domain.UserRepository; import org.springframework.boot.test.context.TestComponent; +import org.springframework.context.annotation.Import; + +import java.util.List; +import java.util.stream.Stream; @TestComponent +@Import(AppConfig.class) @RequiredArgsConstructor class Repository { @@ -31,65 +35,65 @@ Meeting saveAndGetOpenMeeting() { List saveAndGetOpenMeetingsByTopic(int size, Topic topic) { var meetings = Stream.generate(() -> MeetingFixture.getOpenMeetingWithTopic(topic)) - .limit(size) - .toList(); + .limit(size) + .toList(); return meetingRepository.saveAllAndFlush(meetings); } List saveAndGetCloseMeetingsTopic(int size, Topic topic) { var meetings = Stream.generate(() -> MeetingFixture.getCloseMeetingWithTopic(topic)) - .limit(size) - .toList(); + .limit(size) + .toList(); return meetingRepository.saveAllAndFlush(meetings); } List saveAndGetOpenMeetingsByTitle(int size, String title) { var meetings = Stream.generate(() -> MeetingFixture.getOpenMeetingWithTitle(title)) - .limit(size) - .toList(); + .limit(size) + .toList(); return meetingRepository.saveAllAndFlush(meetings); } List saveAndGetCloseMeetingsByTitle(int size, String title) { var meetings = Stream.generate(() -> MeetingFixture.getCloseMeetingWithTitle(title)) - .limit(size) - .toList(); + .limit(size) + .toList(); return meetingRepository.saveAllAndFlush(meetings); } List saveAndGetOpenMeetingsByIntroduction(int size, String introduction) { var meetings = Stream.generate(() -> MeetingFixture.getOpenMeetingWithIntroduction(introduction)) - .limit(size) - .toList(); + .limit(size) + .toList(); return meetingRepository.saveAllAndFlush(meetings); } List saveAndGetCloseMeetingsByIntroduction(int size, String introduction) { var meetings = Stream.generate(() -> MeetingFixture.getCloseMeetingWithIntroduction(introduction)) - .limit(size) - .toList(); + .limit(size) + .toList(); return meetingRepository.saveAllAndFlush(meetings); } List saveAndGetOpenMeetingsByParticipantUserId(int size, Long participantUserId) { var meetings = Stream.generate(() -> MeetingFixture.getOpenMeetingWithParticipantUserId(participantUserId)) - .limit(size) - .toList(); + .limit(size) + .toList(); return meetingRepository.saveAllAndFlush(meetings); } List saveAndGetCloseMeetingsByParticipantUserId(int size, Long participantUserId) { var meetings = Stream.generate(() -> MeetingFixture.getCloseMeetingWithParticipantUserId(participantUserId)) - .limit(size) - .toList(); + .limit(size) + .toList(); return meetingRepository.saveAllAndFlush(meetings); } List saveAndGetOpenMeetings(int size) { var meetings = Stream.generate(MeetingFixture::getOpenMeeting) - .limit(size) - .toList(); + .limit(size) + .toList(); return meetingRepository.saveAllAndFlush(meetings); } diff --git a/src/test/java/net/teumteum/integration/UserIntegrationTest.java b/src/test/java/net/teumteum/integration/UserIntegrationTest.java index 66202ae4..cb0cd129 100644 --- a/src/test/java/net/teumteum/integration/UserIntegrationTest.java +++ b/src/test/java/net/teumteum/integration/UserIntegrationTest.java @@ -10,6 +10,7 @@ import java.util.List; + @DisplayName("유저 통합테스트의") class UserIntegrationTest extends IntegrationTest { diff --git a/src/test/java/net/teumteum/user/domain/UserFixture.java b/src/test/java/net/teumteum/user/domain/UserFixture.java index 12f091d2..5365cb14 100644 --- a/src/test/java/net/teumteum/user/domain/UserFixture.java +++ b/src/test/java/net/teumteum/user/domain/UserFixture.java @@ -16,6 +16,12 @@ public static User getNullIdUser() { .build()); } + public static User getIdUser() { + return newUserByBuilder(UserBuilder.builder() + .id(1L) + .build()); + } + public static User getUserWithId(Long id) { return newUserByBuilder(UserBuilder.builder() .id(id) diff --git a/src/test/java/net/teumteum/user/domain/UserRepositoryTest.java b/src/test/java/net/teumteum/user/domain/UserRepositoryTest.java index 19ad6119..f786240b 100644 --- a/src/test/java/net/teumteum/user/domain/UserRepositoryTest.java +++ b/src/test/java/net/teumteum/user/domain/UserRepositoryTest.java @@ -1,15 +1,19 @@ package net.teumteum.user.domain; import jakarta.persistence.EntityManager; -import java.util.Optional; +import net.teumteum.core.config.AppConfig; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; + +import java.util.Optional; @DataJpaTest +@Import(AppConfig.class) @DisplayName("UserRepository 클래스의") class UserRepositoryTest { @@ -56,10 +60,10 @@ void Find_success_if_exists_user_id_input() { // then Assertions.assertThat(result) - .isPresent() - .usingRecursiveComparison() - .ignoringFields("value.createdAt", "value.updatedAt") - .isEqualTo(Optional.of(existsUser)); + .isPresent() + .usingRecursiveComparison() + .ignoringFields("value.createdAt", "value.updatedAt") + .isEqualTo(Optional.of(existsUser)); } } diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index b36ebf4d..7702ec21 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -11,11 +11,4 @@ logging.level.org.hibernate.type.descriptor.sql=trace spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.highlight_sql=true spring.jpa.properties.hibernate.use_sql_comments=true -jwt.bearer=Bearer -jwt.secret=lwEyVBsYt9V7zq57TejMnVUyzblYcfPQye08f7MGVA9kkkkk -jwt.access.expiration=300 -jwt.access.header=Authorization -jwt.refresh.expiration=2000 -jwt.refresh.header=Authorization-refresh -spring.data.redis.host=localhost -spring.data.redis.port=6379 +