From 1c966f3caed612064d2efe9b263eb29e409de4e2 Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Wed, 4 Jan 2023 14:05:50 +0900 Subject: [PATCH 01/10] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sptp/backend/member/service/MemberService.java | 6 ++++++ .../com/sptp/backend/member/web/MemberController.java | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/main/java/com/sptp/backend/member/service/MemberService.java b/src/main/java/com/sptp/backend/member/service/MemberService.java index 9691da62..9270a828 100644 --- a/src/main/java/com/sptp/backend/member/service/MemberService.java +++ b/src/main/java/com/sptp/backend/member/service/MemberService.java @@ -165,4 +165,10 @@ public void updateUser(Long loginMemberId, MemberUpdateRequest dto) { findMember.updateUser(dto); } + + @Transactional + public void withdrawUser(Long loginMemberId) { + + memberRepository.deleteById(loginMemberId); + } } \ No newline at end of file diff --git a/src/main/java/com/sptp/backend/member/web/MemberController.java b/src/main/java/com/sptp/backend/member/web/MemberController.java index 753bcfb5..b4471419 100644 --- a/src/main/java/com/sptp/backend/member/web/MemberController.java +++ b/src/main/java/com/sptp/backend/member/web/MemberController.java @@ -185,4 +185,15 @@ public ResponseEntity updateUser(@AuthenticationPrincipal CustomUserDetails u return new ResponseEntity(HttpStatus.OK); } + + @DeleteMapping("/members") + public ResponseEntity withdrawUser( + @RequestHeader("accessToken") String accessToken, + @AuthenticationPrincipal CustomUserDetails userDetails) { + + memberService.logout(accessToken); + memberService.withdrawUser(userDetails.getMember().getId()); + + return ResponseEntity.status(HttpStatus.OK).build(); + } } \ No newline at end of file From 51cd836055baa2e69d8db877f4cdb8a6dd69f5f7 Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Wed, 4 Jan 2023 14:40:56 +0900 Subject: [PATCH 02/10] =?UTF-8?q?style:=20TODO=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/sptp/backend/member/service/MemberService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/sptp/backend/member/service/MemberService.java b/src/main/java/com/sptp/backend/member/service/MemberService.java index 9270a828..298617e7 100644 --- a/src/main/java/com/sptp/backend/member/service/MemberService.java +++ b/src/main/java/com/sptp/backend/member/service/MemberService.java @@ -169,6 +169,7 @@ public void updateUser(Long loginMemberId, MemberUpdateRequest dto) { @Transactional public void withdrawUser(Long loginMemberId) { + // TODO 키워드 제거 기능 추가 memberRepository.deleteById(loginMemberId); } } \ No newline at end of file From 6f91d3ef80102b7d4759f65ca77319732869016d Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Wed, 4 Jan 2023 19:50:21 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat=20:=20MemberKeyword=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemberKeywordCustomRepository.java | 5 +++++ .../MemberKeywordCustomRepositoryImpl.java | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordCustomRepository.java create mode 100644 src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordCustomRepositoryImpl.java diff --git a/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordCustomRepository.java b/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordCustomRepository.java new file mode 100644 index 00000000..030ace5e --- /dev/null +++ b/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordCustomRepository.java @@ -0,0 +1,5 @@ +package com.sptp.backend.memberkeyword.repository; + +public interface MemberKeywordCustomRepository { + void deleteByMemberId(Long memberId); +} diff --git a/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordCustomRepositoryImpl.java b/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordCustomRepositoryImpl.java new file mode 100644 index 00000000..a4fb76f6 --- /dev/null +++ b/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordCustomRepositoryImpl.java @@ -0,0 +1,19 @@ +package com.sptp.backend.memberkeyword.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; + +import static com.sptp.backend.memberkeyword.repository.QMemberKeyword.*; + +@RequiredArgsConstructor +public class MemberKeywordCustomRepositoryImpl implements MemberKeywordCustomRepository { + + private final JPAQueryFactory queryFactory; + + @Override + public void deleteByMemberId(Long memberId) { + queryFactory.delete(memberKeyword) + .where(memberKeyword.member.id.eq(memberId)) + .execute(); + } +} From f27490195ddd7dc42fca71282ca751a67d37780c Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Wed, 4 Jan 2023 19:50:58 +0900 Subject: [PATCH 04/10] =?UTF-8?q?chore:=20QueryDsl=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 31 +++++++++++++++++++ .../sptp/backend/common/config/DBConfig.java | 15 +++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/com/sptp/backend/common/config/DBConfig.java diff --git a/build.gradle b/build.gradle index 65df50e5..49f2f3a6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,14 @@ +buildscript { + ext { + queryDslVersion = "5.0.0" + } +} + plugins { id 'java' id 'org.springframework.boot' version '2.7.6' id 'io.spring.dependency-management' version '1.0.15.RELEASE' + id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'com.sptp' @@ -46,8 +53,32 @@ dependencies { //gson implementation 'com.google.code.gson:gson:2.9.0' + //QueryDsl + implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" + implementation "com.querydsl:querydsl-apt:${queryDslVersion}" } tasks.named('test') { useJUnitPlatform() } + +//querydsl 추가 시작 +def querydslDir = "$buildDir/generated/querydsl" +querydsl { + jpa = true + querydslSourcesDir = querydslDir +} +sourceSets { + main.java.srcDir querydslDir +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } + querydsl.extendsFrom compileClasspath +} +compileQuerydsl { + options.annotationProcessorPath = configurations.querydsl +} +//querydsl 추가 끝 diff --git a/src/main/java/com/sptp/backend/common/config/DBConfig.java b/src/main/java/com/sptp/backend/common/config/DBConfig.java new file mode 100644 index 00000000..f9a882aa --- /dev/null +++ b/src/main/java/com/sptp/backend/common/config/DBConfig.java @@ -0,0 +1,15 @@ +package com.sptp.backend.common.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.persistence.EntityManager; + +@Configuration +public class DBConfig { + @Bean + public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) { + return new JPAQueryFactory(entityManager); + } +} From 8cdc0685db5b0d42fb3312c9c8672091fdeb9b7d Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Wed, 4 Jan 2023 19:57:17 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat:=20memberKeyword=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=ED=98=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sptp/backend/member/service/MemberService.java | 2 +- .../memberkeyword/repository/MemberKeywordRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sptp/backend/member/service/MemberService.java b/src/main/java/com/sptp/backend/member/service/MemberService.java index fdaedad4..8bf83992 100644 --- a/src/main/java/com/sptp/backend/member/service/MemberService.java +++ b/src/main/java/com/sptp/backend/member/service/MemberService.java @@ -202,7 +202,7 @@ public void updateUser(Long loginMemberId, MemberUpdateRequest dto) { @Transactional public void withdrawUser(Long loginMemberId) { - // TODO 키워드 제거 기능 추가 + memberKeywordRepository.deleteByMemberId(loginMemberId); memberRepository.deleteById(loginMemberId); } } diff --git a/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepository.java b/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepository.java index 177bd36a..46280441 100644 --- a/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepository.java +++ b/src/main/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepository.java @@ -2,5 +2,5 @@ import org.springframework.data.jpa.repository.JpaRepository; -public interface MemberKeywordRepository extends JpaRepository { +public interface MemberKeywordRepository extends JpaRepository, MemberKeywordCustomRepository { } From 34e9e945131222c67b01c5c42db21f20ea68e44f Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Thu, 5 Jan 2023 10:39:10 +0900 Subject: [PATCH 06/10] =?UTF-8?q?chore:=20h2=20=EC=9D=98=EC=A1=B4=EC=84=B1?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 49f2f3a6..8e73b480 100644 --- a/build.gradle +++ b/build.gradle @@ -56,6 +56,9 @@ dependencies { //QueryDsl implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" implementation "com.querydsl:querydsl-apt:${queryDslVersion}" + + //H2 + runtimeOnly 'com.h2database:h2' } tasks.named('test') { From 7352975e2512e9cbb8125bd7f585f198794a6c56 Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Thu, 5 Jan 2023 10:39:28 +0900 Subject: [PATCH 07/10] =?UTF-8?q?chore:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=9A=A9=20application=20yml=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/application.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/resources/application.yml diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 00000000..9c45aba3 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,17 @@ +spring: + test: + database: +# replace: none // 인메모리 DB가 아닌 MySQL을 사용하기 위한 설정 + + datasource: + url: ${application.spring.datasource.url} + username: ${application.spring.datasource.username} + password: ${application.spring.datasource.password} + driver-class-name: org.h2.Driver + + jpa: + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true From 0a7c1f52c40427d21aa93b88073505250f2fc53a Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Thu, 5 Jan 2023 10:39:48 +0900 Subject: [PATCH 08/10] =?UTF-8?q?test:=20=ED=9A=8C=EC=9B=90=20=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemberKeywordRepositoryTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/test/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepositoryTest.java diff --git a/src/test/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepositoryTest.java b/src/test/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepositoryTest.java new file mode 100644 index 00000000..485c8685 --- /dev/null +++ b/src/test/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepositoryTest.java @@ -0,0 +1,75 @@ +package com.sptp.backend.memberkeyword.repository; + +import com.sptp.backend.common.config.DBConfig; +import com.sptp.backend.common.config.PropertyConfig; +import com.sptp.backend.member.repository.Member; +import com.sptp.backend.memberkeyword.MemberKeywordMap; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +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.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; + +import javax.persistence.EntityManager; +import java.util.HashMap; +import java.util.List; + +@DataJpaTest +@Import({DBConfig.class, PropertyConfig.class}) +class MemberKeywordRepositoryTest { + + @Autowired + EntityManager entityManager; + + @Autowired + MemberKeywordRepository memberKeywordRepository; + + @Nested + class deleteByMemberIdTest { + + Member member = createMember(); + + @BeforeEach + void init() { + // 테스트용 데이터 삽입 + entityManager.persist(member); + for (int keywordId = 1; keywordId < 3; keywordId++) { + entityManager.persist(createMemberKeyword(member, keywordId)); + } + } + + @Test + void success() { + //given + long memberId = member.getId(); + long count = memberKeywordRepository.count(); + + //when + memberKeywordRepository.deleteByMemberId(memberId); + long currentCount = memberKeywordRepository.count(); + + //then + Assertions.assertThat(count).isNotEqualTo(currentCount); + Assertions.assertThat(currentCount).isEqualTo(0L); + } + } + + private static MemberKeyword createMemberKeyword(Member member, int keywordId) { + return MemberKeyword.builder() + .member(member) + .keywordId(keywordId) + .build(); + } + + private static Member createMember() { + + return Member.builder() + .userId("test") + .password("12345678") + .build(); + } +} \ No newline at end of file From 2279e3e09d6d28b969174ca10faa54a865f9b447 Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Thu, 5 Jan 2023 12:35:19 +0900 Subject: [PATCH 09/10] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemberKeywordRepositoryTest.java | 5 --- src/test/resources/application.yml | 44 +++++++++++++++++-- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepositoryTest.java b/src/test/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepositoryTest.java index 485c8685..21b86113 100644 --- a/src/test/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepositoryTest.java +++ b/src/test/java/com/sptp/backend/memberkeyword/repository/MemberKeywordRepositoryTest.java @@ -3,20 +3,15 @@ import com.sptp.backend.common.config.DBConfig; import com.sptp.backend.common.config.PropertyConfig; import com.sptp.backend.member.repository.Member; -import com.sptp.backend.memberkeyword.MemberKeywordMap; import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; 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.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; import javax.persistence.EntityManager; -import java.util.HashMap; -import java.util.List; @DataJpaTest @Import({DBConfig.class, PropertyConfig.class}) diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 9c45aba3..3a980a93 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -1,7 +1,7 @@ spring: - test: - database: -# replace: none // 인메모리 DB가 아닌 MySQL을 사용하기 위한 설정 + redis: + host: localhost + port: ${application.spring.redis.port} datasource: url: ${application.spring.datasource.url} @@ -15,3 +15,41 @@ spring: properties: hibernate: format_sql: true + + security: + oauth2: + client: + registration: + kakao: + client-id: ${application.spring.security.kakao.client-id} + client-secret: ${application.spring.security.kakao.client-secret} + redirect-uri: ${application.spring.security.kakao.redirect-uri} + authorization-grant-type: authorization_code + client-authentication-method: POST + client-name: Kakao + scope: + - profile_nickname + - account_email + naver: + client-id: ${application.spring.security.naver.client-id} + client-secret: ${application.spring.security.naver.client-secret} + redirect-uri: ${application.spring.security.naver.redirect-uri} + authorization-grant-type: authorization_code + scope: + - name + - email + provider: + kakao: + authorization-uri: https://kauth.kakao.com/oauth/authorize + token-uri: https://kauth.kakao.com/oauth/token + user-info-uri: https://kapi.kakao.com/v2/user/me + user-name-attribute: id + naver: + authorization-uri: https://nid.naver.com/oauth2.0/authorize + token-uri: https://nid.naver.com/oauth2.0/token + user-info-uri: https://openapi.naver.com/v1/nid/me + user-name-attribute: response + +jwt: + secret: ${application.jwt.secret} + secret_refresh: ${application.jwt.secret_refresh} \ No newline at end of file From 9e5ccaee570ffe73a66b044168778d51ce916b9b Mon Sep 17 00:00:00 2001 From: JunYoung-C Date: Thu, 5 Jan 2023 22:04:39 +0900 Subject: [PATCH 10/10] =?UTF-8?q?chore:=20yml=20h2=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/application.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 3a980a93..6a33f7cc 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -3,12 +3,6 @@ spring: host: localhost port: ${application.spring.redis.port} - datasource: - url: ${application.spring.datasource.url} - username: ${application.spring.datasource.username} - password: ${application.spring.datasource.password} - driver-class-name: org.h2.Driver - jpa: hibernate: ddl-auto: create