Skip to content

Commit e78b822

Browse files
[Feat] Blocklist API 수정, queryDsl 세팅
#22
1 parent 87cdc14 commit e78b822

File tree

9 files changed

+136
-67
lines changed

9 files changed

+136
-67
lines changed

build.gradle.kts

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,25 @@ dependencies {
3535

3636
// Spring OAuth2
3737
// implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
38-
implementation ("org.springframework.boot:spring-boot-starter-security")
38+
implementation("org.springframework.boot:spring-boot-starter-security")
3939

4040
// Valid
4141
// implementation("org.springframework.boot:spring-boot-starter-validation")
4242

4343
// MariaDB & Spring JPA
4444
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
45-
runtimeOnly ("org.mariadb.jdbc:mariadb-java-client")
45+
runtimeOnly("org.mariadb.jdbc:mariadb-java-client")
4646

4747
// JWT
48-
implementation ("io.jsonwebtoken:jjwt-api:0.11.5")
49-
implementation ("io.jsonwebtoken:jjwt-impl:0.11.5")
50-
implementation ("io.jsonwebtoken:jjwt-jackson:0.11.5")
48+
implementation("io.jsonwebtoken:jjwt-api:0.11.5")
49+
implementation("io.jsonwebtoken:jjwt-impl:0.11.5")
50+
implementation("io.jsonwebtoken:jjwt-jackson:0.11.5")
5151

5252
// Redis
5353
implementation("org.springframework.boot:spring-boot-starter-data-redis")
5454

5555
// Swagger
56-
implementation ("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0")
56+
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0")
5757

5858
// Lombok
5959
compileOnly("org.projectlombok:lombok:1.18.30")
@@ -67,23 +67,54 @@ dependencies {
6767
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
6868

6969
// logger
70-
implementation ("org.springframework.boot:spring-boot-starter-logging")
70+
implementation("org.springframework.boot:spring-boot-starter-logging")
7171

7272
// validation
73-
implementation ("org.springframework.boot:spring-boot-starter-validation")
73+
implementation("org.springframework.boot:spring-boot-starter-validation")
7474

7575
// Feign
7676
implementation("org.springframework.cloud:spring-cloud-starter-openfeign")
7777

7878
// Mail
79-
implementation ("org.springframework.boot:spring-boot-starter-mail")
79+
implementation("org.springframework.boot:spring-boot-starter-mail")
8080

8181
// Kafka
8282
// implementation ("org.springframework.kafka:spring-kafka")
8383
// implementation ("org.apache.kafka:kafka-streams")
8484
// implementation ("org.apache.kafka:kafka-clients")
85+
86+
//QueryDSL 추가
87+
implementation ("com.querydsl:querydsl-apt:5.0.0")
88+
implementation ("com.querydsl:querydsl-jpa:5.0.0:jakarta")
89+
implementation ("com.querydsl:querydsl-core:5.0.0")
90+
annotationProcessor ("com.querydsl:querydsl-apt:5.0.0:jakarta")
91+
annotationProcessor ("jakarta.annotation:jakarta.annotation-api")
92+
annotationProcessor ("jakarta.persistence:jakarta.persistence-api")
93+
8594
}
8695

8796
tasks.withType<Test> {
8897
useJUnitPlatform()
8998
}
99+
100+
// Querydsl 빌드 옵션 설정
101+
val generatedDir = "src/main/generated"
102+
103+
// querydsl QClass 파일 생성 위치를 지정
104+
tasks.withType<JavaCompile> {
105+
options.generatedSourceOutputDirectory.set(file(generatedDir))
106+
}
107+
108+
// java source set에 querydsl QClass 위치 추가
109+
sourceSets {
110+
getByName("main") {
111+
java {
112+
srcDir(generatedDir)
113+
}
114+
}
115+
}
116+
117+
// gradle clean 시에 QClass 디렉토리 삭제
118+
tasks.named<Delete>("clean") {
119+
delete(file(generatedDir))
120+
}

src/main/java/org/dfbf/soundlink/domain/blocklist/controller/BlockListController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public ResponseResult blockUser(
2424
@AuthenticationPrincipal Long userId,
2525
@RequestBody String tag
2626
) {
27-
return blockListService.blockUser(userId, tag);
27+
return blockListService.blockUser(1L, tag);
2828
}
2929

3030
@DeleteMapping
@@ -36,7 +36,7 @@ public ResponseResult unblockUser(
3636
@AuthenticationPrincipal Long userId,
3737
@RequestBody Long blocklistId
3838
) {
39-
return blockListService.unblockUser(userId, blocklistId);
39+
return blockListService.unblockUser(1L, blocklistId);
4040
}
4141

4242
@GetMapping("/mypage/blackListSearch")
@@ -45,6 +45,6 @@ public ResponseResult unblockUser(
4545
description = "해당 유저의 차단 목록을 가져옵니다."
4646
)
4747
public ResponseResult getBlockList(@AuthenticationPrincipal Long userId) {
48-
return blockListService.getBlockListByUserId(userId);
48+
return blockListService.getBlockListByUserId(1L);
4949
}
5050
}

src/main/java/org/dfbf/soundlink/domain/blocklist/entity/Blocklist.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class Blocklist {
1818

1919
@Id
2020
@GeneratedValue(strategy = GenerationType.IDENTITY)
21+
@Column(name = "blocklist_id")
2122
private Long blocklistId;
2223

2324
@ManyToOne
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.dfbf.soundlink.domain.blocklist.repository;
2+
3+
import org.dfbf.soundlink.domain.blocklist.entity.Blocklist;
4+
import java.util.List;
5+
import java.util.Optional;
6+
7+
public interface BlockListCustomRepository {
8+
List<Blocklist> findAllByUser_UserId(Long userId);
9+
Optional<Blocklist> findByUser_UserIdAndBlockedUser_LoginId(Long userId, String loginId);
10+
Optional<Blocklist> findByUser_UserIdAndBlockedUser_UserId(Long userId, Long blockedUserId);
11+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.dfbf.soundlink.domain.blocklist.repository;
2+
3+
4+
import com.querydsl.jpa.impl.JPAQueryFactory;
5+
import lombok.RequiredArgsConstructor;
6+
import org.dfbf.soundlink.domain.blocklist.entity.Blocklist;
7+
import org.dfbf.soundlink.domain.blocklist.entity.QBlocklist;
8+
import org.springframework.stereotype.Repository;
9+
10+
import java.util.List;
11+
import java.util.Optional;
12+
13+
@Repository
14+
@RequiredArgsConstructor
15+
public class BlockListQueryRepository implements BlockListCustomRepository {
16+
17+
private final JPAQueryFactory jpaQueryFactory;
18+
private final QBlocklist qBlocklist = QBlocklist.blocklist;
19+
20+
@Override
21+
public List<Blocklist> findAllByUser_UserId(Long userId) {
22+
return jpaQueryFactory
23+
.selectFrom(qBlocklist)
24+
.where(qBlocklist.user.userId.eq(userId))
25+
.fetch();
26+
}
27+
28+
@Override
29+
public Optional<Blocklist> findByUser_UserIdAndBlockedUser_LoginId(Long userId, String loginId) {
30+
return Optional.ofNullable(
31+
jpaQueryFactory
32+
.selectFrom(qBlocklist)
33+
.where(
34+
qBlocklist.user.userId.eq(userId),
35+
qBlocklist.blockedUser.loginId.eq(loginId)
36+
)
37+
.fetchOne()
38+
);
39+
}
40+
41+
@Override
42+
public Optional<Blocklist> findByUser_UserIdAndBlockedUser_UserId(Long userId, Long blockedUserId) {
43+
return Optional.ofNullable(
44+
jpaQueryFactory
45+
.selectFrom(qBlocklist)
46+
.where(
47+
qBlocklist.user.userId.eq(userId),
48+
qBlocklist.blockedUser.userId.eq(blockedUserId)
49+
)
50+
.fetchOne()
51+
);
52+
}
53+
}
Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,7 @@
11
package org.dfbf.soundlink.domain.blocklist.repository;
22

3-
43
import org.dfbf.soundlink.domain.blocklist.entity.Blocklist;
54
import org.springframework.data.jpa.repository.JpaRepository;
6-
import org.springframework.data.jpa.repository.Query;
7-
import org.springframework.data.repository.query.Param;
8-
import org.springframework.stereotype.Repository;
9-
10-
import java.util.List;
11-
import java.util.Optional;
12-
13-
@Repository
14-
public interface BlockListRepository extends JpaRepository<Blocklist, Long> {
15-
@Query(
16-
"SELECT b " +
17-
"FROM Blocklist b " +
18-
"WHERE b.user.userId = :userId"
19-
)
20-
List<Blocklist> findAllByUserId(@Param("userId") Long userId);
21-
22-
@Query(
23-
"SELECT b " +
24-
"FROM Blocklist b " +
25-
"WHERE b.user.userId = :userId " +
26-
"AND b.blockedUser.loginId = :loginId"
27-
)
28-
Optional<Blocklist> findByUserIdAndLoginId(
29-
@Param("userId") Long userId,
30-
@Param("loginId") String loginId
31-
);
325

33-
@Query(
34-
"SELECT b " +
35-
"FROM Blocklist b " +
36-
"WHERE b.user.userId = :userId " +
37-
"AND b.blockedUser.userId = :blockedUserId"
38-
)
39-
Optional<Blocklist> findByUserIdAndBlocklistId(
40-
@Param("userId") Long userId,
41-
@Param("blockedUserId") Long blockedUserId
42-
);
6+
public interface BlockListRepository extends JpaRepository<Blocklist, Long>, BlockListCustomRepository {
437
}

src/main/java/org/dfbf/soundlink/domain/blocklist/service/BlockListService.java

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.dfbf.soundlink.domain.blocklist.exception.AlreadyBlockedUser;
88
import org.dfbf.soundlink.domain.blocklist.exception.BlockedUserNotFound;
99
import org.dfbf.soundlink.domain.blocklist.exception.BlockingUserNotFound;
10+
import org.dfbf.soundlink.domain.blocklist.repository.BlockListQueryRepository;
1011
import org.dfbf.soundlink.domain.blocklist.repository.BlockListRepository;
1112
import org.dfbf.soundlink.domain.user.entity.User;
1213
import org.dfbf.soundlink.domain.user.repository.UserRepository;
@@ -20,8 +21,9 @@
2021
@Service
2122
@RequiredArgsConstructor
2223
public class BlockListService {
23-
private final BlockListRepository blockListRepository;
24+
private final BlockListQueryRepository blockListQueryRepository;
2425
private final UserRepository userRepository;
26+
private final BlockListRepository blockListRepository;
2527

2628
@Transactional
2729
public ResponseResult blockUser(Long userId, String tag) {
@@ -34,7 +36,7 @@ public ResponseResult blockUser(Long userId, String tag) {
3436
.orElseThrow(
3537
BlockingUserNotFound::new
3638
);
37-
blockListRepository.findByUserIdAndLoginId(
39+
blockListQueryRepository.findByUser_UserIdAndBlockedUser_LoginId(
3840
userId, tag
3941
).ifPresent(block -> {
4042
throw new AlreadyBlockedUser();
@@ -48,13 +50,7 @@ public ResponseResult blockUser(Long userId, String tag) {
4850
blockListRepository.save(blockTarget);
4951

5052
return new ResponseResult(
51-
ErrorCode.SUCCESS,
52-
new BlockRes(
53-
blockTarget.getUser().getUserId(),
54-
blockTarget.getBlockedUser().getUserId(),
55-
blockTarget.getCreatedAt(),
56-
blockTarget.getUpdatedAt()
57-
)
53+
ErrorCode.SUCCESS
5854
);
5955
} catch (BlockedUserNotFound e) {
6056
return new ResponseResult(
@@ -77,20 +73,14 @@ public ResponseResult blockUser(Long userId, String tag) {
7773
@Transactional
7874
public ResponseResult unblockUser(Long userId, Long blocklistId) {
7975
try {
80-
Blocklist block = blockListRepository.findByUserIdAndBlocklistId(
76+
Blocklist block = blockListQueryRepository.findByUser_UserIdAndBlockedUser_UserId(
8177
userId, blocklistId
8278
).orElseThrow(BlockingUserNotFound::new);
8379

8480
blockListRepository.delete(block);
8581

8682
return new ResponseResult(
87-
ErrorCode.SUCCESS,
88-
new BlockRes(
89-
block.getUser().getUserId(),
90-
block.getBlockedUser().getUserId(),
91-
block.getCreatedAt(),
92-
block.getUpdatedAt()
93-
)
83+
ErrorCode.SUCCESS
9484
);
9585
} catch (BlockingUserNotFound e) {
9686
return new ResponseResult(
@@ -101,7 +91,7 @@ public ResponseResult unblockUser(Long userId, Long blocklistId) {
10191
}
10292

10393
public ResponseResult getBlockListByUserId(Long userId) {
104-
List<Blocklist> blocklist = blockListRepository.findAllByUserId(userId);
94+
List<Blocklist> blocklist = blockListQueryRepository.findAllByUser_UserId(userId);
10595
return new ResponseResult(
10696
ErrorCode.SUCCESS,
10797
blocklist.stream()

src/main/java/org/dfbf/soundlink/domain/user/entity/User.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
public class User {
2020
@Id
2121
@GeneratedValue(strategy = GenerationType.IDENTITY)
22+
@Column(name = "user_id")
2223
private Long userId;
2324

2425
@Column(unique = true)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.dfbf.soundlink.global.config;
2+
3+
import com.querydsl.jpa.impl.JPAQueryFactory;
4+
import jakarta.persistence.EntityManager;
5+
import jakarta.persistence.PersistenceContext;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
@Configuration
10+
public class QueryDslConfig {
11+
@PersistenceContext
12+
private EntityManager entityManager;
13+
14+
@Bean
15+
public JPAQueryFactory jpaQueryFactory(){
16+
return new JPAQueryFactory(entityManager);
17+
}
18+
}

0 commit comments

Comments
 (0)