Skip to content

Commit 7666477

Browse files
authored
feat: 소셜 기능 구현
# 변경점 👍 close: #10 1. 액세스토큰, 리프래시 토큰에 Identifier가 아닌 userId를 담도록 구현 (`.getReferenceById`를 통한 성능 최적화를 위함) 2. 기본적인 회원관련 CRUD 전부 구현 2. `presignedUrl`을 활용한 이미지 업로드 구현 3. `Subscribe` 도메인을 활용한 구독기능 구현 3번을 제외하면 나머지는 단순 CRUD이기 때문에 딱히 설명드릴 부분이 없는 것 같습니다. `presignedUrl` 관련해서 설명을 드리자면 흐름은 다음과 같습니다. 1. `GET /api/presigned-url`를 통해 프론트엔드에 `presignedUrl`를 발급하고 `TemporalFile`에 저장 2. 발급된 `presignedUrl`를 바탕으로 프론트엔드에서 이미지 업로드 3. 프론트엔드에서는 이미지 업로드가 확정될때 `TemporalFile`의 기본키와 `presignedUrl`을 보냄 -> 여기서 `TemporalFile`에서 삭제 4. 만약 `TemporalFile`에 하루 이상 저장되었던 엔트리가 있으면 이는 고아 객체이기 때문에 스케줄링을 통해서 `TemporalFile`과 s3에서 삭제 이해하기 어려운 부분이 있으면 목요일 회의때 더 자세하게 설명드릴게용 # 비고 ✏ 피그마 기준으로 남은 작업 1. 월별 `DiaryEntity` 조회 6. 회원 PK 기준으로 `DiaryEntity`조회 7. 좋아요 기능 위 3가지 작업 부탁드립니다!
1 parent d84a960 commit 7666477

File tree

59 files changed

+1628
-245
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1628
-245
lines changed

build.gradle

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ dependencies {
5353

5454
// validation
5555
implementation 'org.springframework.boot:spring-boot-starter-validation'
56+
57+
//Querydsl
58+
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
59+
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
60+
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
61+
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
62+
63+
// aws
64+
implementation 'software.amazon.awssdk:s3:2.20.0'
5665
}
5766

5867
tasks.named('test') {

src/main/java/apptive/team5/config/DefaultImageConfig.java

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package apptive.team5.config;
2+
3+
import apptive.team5.global.AwsProperties;
4+
import apptive.team5.global.util.S3Util;
5+
import jakarta.annotation.PostConstruct;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
10+
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
11+
import software.amazon.awssdk.regions.Region;
12+
import software.amazon.awssdk.services.s3.S3Client;
13+
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
14+
15+
@Configuration
16+
@RequiredArgsConstructor
17+
public class S3Config {
18+
19+
private final AwsProperties awsProperties;
20+
21+
@PostConstruct
22+
public void initS3Util() {
23+
S3Util.setS3Url(awsProperties.s3Url());
24+
}
25+
26+
@Bean
27+
public S3Presigner s3Presigner() {
28+
S3Presigner.Builder builder = S3Presigner.builder()
29+
.region(Region.of(awsProperties.region()));
30+
31+
builder.credentialsProvider(StaticCredentialsProvider.create(
32+
AwsBasicCredentials.create(awsProperties.accessKey(), awsProperties.secretKey())
33+
));
34+
35+
return builder.build();
36+
}
37+
38+
@Bean
39+
public S3Client s3Client() {
40+
S3Client s3Client = S3Client.builder()
41+
.region(Region.of(awsProperties.region()))
42+
.credentialsProvider(StaticCredentialsProvider.create(
43+
AwsBasicCredentials.create(awsProperties.accessKey(), awsProperties.secretKey())
44+
))
45+
.build();
46+
47+
return s3Client;
48+
}
49+
}

src/main/java/apptive/team5/config/SecurityConfig.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package apptive.team5.config;
22

3-
import apptive.team5.filter.CustomLogoutFilter;
4-
import apptive.team5.filter.JWTFilter;
3+
import apptive.team5.global.filter.CustomLogoutFilter;
4+
import apptive.team5.global.filter.JWTFilter;
55
import apptive.team5.jwt.component.JWTUtil;
66
import apptive.team5.jwt.service.JwtService;
77
import apptive.team5.user.service.UserLowService;
88
import com.fasterxml.jackson.databind.ObjectMapper;
9-
import jakarta.servlet.http.HttpServletResponse;
109
import lombok.RequiredArgsConstructor;
1110
import org.springframework.context.annotation.Bean;
1211
import org.springframework.context.annotation.Configuration;

src/main/java/apptive/team5/config/WebConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package apptive.team5.config;
22

3-
import apptive.team5.filter.LoggingFilter;
3+
import apptive.team5.global.filter.LoggingFilter;
44
import org.springframework.boot.web.servlet.FilterRegistrationBean;
55
import org.springframework.context.annotation.Bean;
66
import org.springframework.context.annotation.Configuration;

src/main/java/apptive/team5/diary/controller/DiaryController.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,42 +34,42 @@ public class DiaryController {
3434
@GetMapping("/my")
3535
public ResponseEntity<Page<DiaryResponse>> getMyMusicDiary(
3636
@AuthenticationPrincipal
37-
String identifier,
37+
Long userId,
3838
@RequestParam(defaultValue = "0")
3939
int page,
4040
@RequestParam(defaultValue = "5")
4141
int size
4242
) {
4343

44-
Page<DiaryResponse> response = diaryService.getMyDiaries(identifier, PageRequest.of(page, size));
44+
Page<DiaryResponse> response = diaryService.getMyDiaries(userId, PageRequest.of(page, size));
4545

4646
return ResponseEntity.status(HttpStatus.OK).body(response);
4747
}
4848

4949
@PostMapping
50-
public ResponseEntity<Void> createDiary(@AuthenticationPrincipal String identifier, @Valid @RequestBody DiaryCreateRequest diaryRequest) {
51-
DiaryEntity diary = diaryService.createDiary(identifier, diaryRequest);
50+
public ResponseEntity<Void> createDiary(@AuthenticationPrincipal Long userId, @Valid @RequestBody DiaryCreateRequest diaryRequest) {
51+
DiaryEntity diary = diaryService.createDiary(userId, diaryRequest);
5252

5353
return ResponseEntity.status(HttpStatus.CREATED).location(URI.create("/api/diaries/" + diary.getId())).build();
5454
}
5555

5656
@PutMapping("/{diaryId}")
5757
public ResponseEntity<Void> updateDiary(
5858
@AuthenticationPrincipal
59-
String identifier,
59+
Long userId,
6060
@PathVariable
6161
Long diaryId,
6262
@RequestBody
6363
DiaryUpdateRequest updateRequest
6464
) {
65-
diaryService.updateDiary(identifier, diaryId, updateRequest);
65+
diaryService.updateDiary(userId, diaryId, updateRequest);
6666

6767
return ResponseEntity.status(HttpStatus.OK).build();
6868
}
6969

7070
@DeleteMapping("/{diaryId}")
71-
public ResponseEntity<Void> deleteDiary(@AuthenticationPrincipal String identifier, @PathVariable Long diaryId) {
72-
diaryService.deleteDiary(identifier, diaryId);
71+
public ResponseEntity<Void> deleteDiary(@AuthenticationPrincipal Long userId, @PathVariable Long diaryId) {
72+
diaryService.deleteDiary(userId, diaryId);
7373

7474
return ResponseEntity.noContent().build();
7575
}

src/main/java/apptive/team5/diary/repository/DiaryRepository.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,16 @@
55
import org.springframework.data.domain.Page;
66
import org.springframework.data.domain.Pageable;
77
import org.springframework.data.jpa.repository.JpaRepository;
8+
import org.springframework.data.jpa.repository.Modifying;
9+
import org.springframework.data.jpa.repository.Query;
810

911
public interface DiaryRepository extends JpaRepository<DiaryEntity, Long> {
1012
Page<DiaryEntity> findByUser(UserEntity user, Pageable pageable);
13+
14+
@Query("select count(d) from DiaryEntity d where d.user.id = :userId")
15+
int countByUserId(Long userId);
16+
17+
@Query("delete from DiaryEntity d where d.user.id = :userId")
18+
@Modifying(clearAutomatically = true)
19+
void deleteByUserId(Long userId);
1120
}

src/main/java/apptive/team5/diary/service/DiaryLowService.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313

1414
@Service
1515
@RequiredArgsConstructor
16+
@Transactional
1617
public class DiaryLowService {
1718
private final DiaryRepository diaryRepository;
1819

19-
@Transactional
2020
public DiaryEntity saveDiary(DiaryEntity diary) {
2121
return diaryRepository.save(diary);
2222
}
@@ -32,7 +32,6 @@ public Page<DiaryEntity> findDiaryByUser(UserEntity user, Pageable pageable) {
3232
return diaryRepository.findByUser(user, pageable);
3333
}
3434

35-
@Transactional
3635
public void updateDiary(DiaryEntity diary, DiaryUpdateDto updateDto) {
3736
diary.update(
3837
updateDto.musicTitle(),
@@ -44,9 +43,17 @@ public void updateDiary(DiaryEntity diary, DiaryUpdateDto updateDto) {
4443
);
4544
}
4645

47-
@Transactional
4846
public void deleteDiary(DiaryEntity diary) {
4947
diaryRepository.delete(diary);
5048
}
5149

50+
@Transactional(readOnly = true)
51+
public int countByUserId(Long userId) {
52+
return diaryRepository.countByUserId(userId);
53+
}
54+
55+
public void deleteByUserId(Long userId) {
56+
diaryRepository.deleteByUserId(userId);
57+
}
58+
5259
}

src/main/java/apptive/team5/diary/service/DiaryService.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,25 @@ public class DiaryService {
2020
private final DiaryLowService diaryLowService;
2121

2222
@Transactional(readOnly = true)
23-
public Page<DiaryResponse> getMyDiaries(String identifier, Pageable pageable) {
24-
UserEntity foundUser = findUserByIdentifier(identifier);
23+
public Page<DiaryResponse> getMyDiaries(Long userId, Pageable pageable) {
24+
UserEntity foundUser = userLowService.getReferenceById(userId);
2525

2626
return diaryLowService.findDiaryByUser(foundUser, pageable)
2727
.map(DiaryResponse::from);
2828
}
2929

3030
@Transactional
31-
public DiaryEntity createDiary(String identifier, DiaryCreateRequest diaryRequest) {
32-
UserEntity foundUser = findUserByIdentifier(identifier);
31+
public DiaryEntity createDiary(Long userId, DiaryCreateRequest diaryRequest) {
32+
UserEntity foundUser = userLowService.getReferenceById(userId);
3333

3434
DiaryEntity diary = DiaryCreateRequest.toEntity(diaryRequest, foundUser);
3535

3636
return diaryLowService.saveDiary(diary);
3737
}
3838

3939
@Transactional
40-
public void updateDiary(String identifier, Long diaryId, DiaryUpdateRequest updateRequest) {
41-
UserEntity foundUser = findUserByIdentifier(identifier);
40+
public void updateDiary(Long userId, Long diaryId, DiaryUpdateRequest updateRequest) {
41+
UserEntity foundUser = userLowService.getReferenceById(userId);
4242

4343
DiaryEntity foundDiary = diaryLowService.findDiaryById(diaryId);
4444

@@ -48,8 +48,8 @@ public void updateDiary(String identifier, Long diaryId, DiaryUpdateRequest upda
4848
}
4949

5050
@Transactional
51-
public void deleteDiary(String identifier, Long diaryId) {
52-
UserEntity foundUser = findUserByIdentifier(identifier);
51+
public void deleteDiary(Long userId, Long diaryId) {
52+
UserEntity foundUser = userLowService.getReferenceById(userId);
5353

5454
DiaryEntity foundDiary = diaryLowService.findDiaryById(diaryId);
5555

@@ -58,7 +58,4 @@ public void deleteDiary(String identifier, Long diaryId) {
5858
diaryLowService.deleteDiary(foundDiary);
5959
}
6060

61-
private UserEntity findUserByIdentifier(String identifier) {
62-
return userLowService.findByIdentifier(identifier);
63-
}
6461
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package apptive.team5.file.controller;
2+
3+
import apptive.team5.file.dto.PresignedUrlResponse;
4+
import apptive.team5.file.service.S3Service;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.http.HttpStatus;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.bind.annotation.GetMapping;
9+
import org.springframework.web.bind.annotation.RequestMapping;
10+
import org.springframework.web.bind.annotation.RestController;
11+
12+
@RestController
13+
@RequiredArgsConstructor
14+
@RequestMapping("/api/presigned-url")
15+
public class S3Controller {
16+
17+
private final S3Service s3Service;
18+
19+
@GetMapping
20+
public ResponseEntity<PresignedUrlResponse> getPresignedURL() {
21+
PresignedUrlResponse response = s3Service.createUploadPresignedURL();
22+
23+
return ResponseEntity.status(HttpStatus.OK).body(response);
24+
}
25+
26+
}

0 commit comments

Comments
 (0)