패스트캠퍼스
패스트캠퍼스 환급챌린지 25일차 : 9개 도메인 프로젝트로 끝내는 백엔드 웹 개발 (Java/Spring) 초격차 패키지 Online 강의 후기
이태우(1990년)
2025. 3. 29. 22:43
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
공부 시작 시각 인증

수강 인증 사진

GetUserResponseDto.java
package org.fastcampus.user.application.dto;
import org.fastcampus.user.domain.User;
public record GetUserResponseDto(Long id, String name, String profileUrl, Integer followingCount, Integer followerCount) {
public GetUserResponseDto(User user) {
this(user.getId(), user.getName(), user.getProfileUrl(),
user.followingCount(), user.followerCount());
}
}
UserService.java
package org.fastcampus.user.application;
import org.fastcampus.user.application.Interfaces.UserRepository;
import org.fastcampus.user.application.dto.CreateUserRequestDto;
import org.fastcampus.user.application.dto.GetUserResponseDto;
import org.fastcampus.user.domain.*;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User createUser(CreateUserRequestDto dto) {
UserInfo userInfo = new UserInfo(dto.userName(), dto.userProfileUrl());
User user = new User(null, userInfo);
return userRepository.save(user);
}
public User getUser(Long id) {
return userRepository.findById(id);
}
public GetUserResponseDto getUserProfile(Long id) {
User user = getUser(id);
return new GetUserResponseDto(user);
}
}
※ UserRelationSerivce.java 클래스 내에서도 @Service 추가함.
※ UserEntity.java 클래스 내 @DynamicUpdate 추가함.
UserRelationRepositoryImpl.java
package org.fastcampus.user.repository;
import jakarta.transaction.Transactional;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.fastcampus.user.application.Interfaces.UserRelationRepository;
import org.fastcampus.user.domain.*;
import org.fastcampus.user.repository.entity.*;
import org.fastcampus.user.repository.jpa.*;
import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class UserRelationRepositoryImpl implements UserRelationRepository {
private final JpaUserRelationRepository jpaUserRelationRepository;
private final JpaUserRepository jpaUserRepository;
@Override
public boolean isAlreadyFollow(User user, User targetUser) {
UserRelationIdEntity id = new UserRelationIdEntity(user.getId(), targetUser.getId());
return jpaUserRelationRepository.existsById(id);
}
@Override
@Transactional
public void save(User user, User targetUser) {
UserRelationEntity entity = new UserRelationEntity(user.getId(), targetUser.getId());
jpaUserRelationRepository.save(entity);
jpaUserRepository.saveAll(List.of(new UserEntity(user), new UserEntity(targetUser)));
}
@Override
@Transactional
public void delete(User user, User targetUser) {
UserRelationIdEntity id = new UserRelationIdEntity(user.getId(), targetUser.getId());
jpaUserRelationRepository.deleteById(id);
jpaUserRepository.saveAll(List.of(new UserEntity(user), new UserEntity(targetUser)));
}
}
UserController.java
package org.fastcampus.user.ui;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.fastcampus.common.ui.*;
import org.fastcampus.user.application.UserService;
import org.fastcampus.user.application.dto.CreateUserRequestDto;
import org.fastcampus.user.application.dto.GetUserListResponseDto;
import org.fastcampus.user.application.dto.GetUserResponseDto;
import org.fastcampus.user.domain.*;
import org.fastcampus.user.repository.jpa.JpaUserListQueryRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
private final JpaUserListQueryRepository userListQueryRepository;
@GetMapping("/{userId}")
public Response<GetUserResponseDto> getUser(@PathVariable(name = "userId") Long userId) {
return Response.OK(userService.getUserProfile(userId));
}
@PostMapping
public Response<Long> createUser(@RequestBody CreateUserRequestDto dto) {
User user = userService.createUser(dto);
return Response.OK(user.getId());
}
@GetMapping("/{userId}/followers")
public Response<List<GetUserListResponseDto>> getFollowerList(@PathVariable(name = "userId") Long userId) {
List<GetUserListResponseDto> result = userListQueryRepository.getFollowerUserList(userId);
return Response.OK(result);
}
@GetMapping("/{userId}/followings")
public Response<List<GetUserListResponseDto>> getFollowingList(@PathVariable(name = "userId") Long userId) {
List<GetUserListResponseDto> result = userListQueryRepository.getFollowingUserList(userId);
return Response.OK(result);
}
}
UserRelationController.java
package org.fastcampus.user.ui;
import lombok.RequiredArgsConstructor;
import org.fastcampus.common.ui.*;
import org.fastcampus.user.application.UserRelationService;
import org.fastcampus.user.application.dto.FollowUserRequestDto;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/relation")
@RequiredArgsConstructor
public class UserRelationController {
private final UserRelationService relationService;
@PostMapping("/follow")
public Response<Void> followUser(@RequestBody FollowUserRequestDto dto) {
relationService.follow(dto);
return Response.OK(null);
}
@PostMapping("/unfollow")
public Response<Void> unfollowUser(@RequestBody FollowUserRequestDto dto) {
relationService.unfollow(dto);
return Response.OK(null);
}
}
학습 인증샷


학습 종료 시각 인증
