Account Service
Controller로 들어온 요청을 처리하는데 사용되는 Sevice 계층을 구현한다.
1. AccountService
■ AccountService
[AccountService]
@Service
@Transactional(readOnly = true) //[1]
@RequiredArgsConstructor
public class AccountService {
private final AccountRepository accountRepository;
private final FileProcessor fileProcessor;
private final BCryptPasswordEncoder bCryptPasswordEncoder;
@Value("${file.profile}") //[2]
private String profileImgPath;
@Transactional
public void saveAccount(Account account){
accountRepository.save(account);
}
.
.
.
}
● [1] : Service계층은 기본적으로 Transactional로 설정해준다(읽기 전용).
● [2] : profileImg가 저장될 경로를 application.yml에 설정된 정보를 토대로 초기화한다.
□ saveAccount
[saveAccount]
@Transactional
public void saveAccount(Account account){
accountRepository.save(account);
}
account를 받아서 DB에 해당 account를 저장하는 메서드
DB가 변경되기 때문에 @Transactional이 붙는다.
□ findByNickname
[findByNickname]
public Account findByNickname(String nickname) {
return accountRepository.findByNickname(nickname)
.orElseThrow(() -> new NonExistResourceException("해당 nickname을 갖는 Account를 찾을 수 없습니다."));
}
DB에서 nickname으로 Account를 찾고 찾아진 Account를 반환한다.
만약 nickname에 해당하는 Account가 없을 경우 NonExistResourceException을 반환
□ findById
[findById]
public Account findById(Long accountId) {
return accountRepository.findById(accountId)
.orElseThrow(() -> new NonExistResourceException("해당 accountId를 갖는 Account를 찾을 수 없습니다."));
}
DB에서 accountId로 Account를 찾고 찾아진 Account를 반환
□ findAll
[findAll]
public List<Account> findAll() {
return accountRepository.findAll();
}
DB의 모든 Account를 List로 반환
□ findAccountByPage
[findAccountByPage]
public QueryResults<Account> findAccountByPage(AccountSearchCond accountSearchCond, Pageable pageable) {
return accountRepository.findAccountsByPage(accountSearchCond, pageable);
}
검색조건과 page정보를 받아서 페이징 된 Account를 QueryResults<Account>로 반환
최종적으로 페이징된 결과는 Page<AccountDto>와 같이 AccountDto로 페이징 된 결과가 반환되야된다.
그리고 이러한 Dto로 변환되는 과정은 컨트롤러에서 이루어진다.
따라서 Service 계층에서는 Page가 아닌 QueryResults<Account>를 반환한다.
□ updateInfo
[updateInfo]
@Transactional
public void updateInfo(Long loginAccountId, Account toAccount) {
Account account = accountRepository.findById(loginAccountId)
.orElseThrow(() -> new NonExistResourceException("해당 id를 갖는 Account를 찾을 수 없습니다."));
account.updateInfo(toAccount);
}
id로 찾아진 Account를 매개변수의 Account 정보를 토대로 변경 한다.
□ updateProfileImg
[updateProfileImg]
@Transactional
public void updateProfileImg(Long loginAccountId, MultipartFile multipartFile) throws IOException {
Account account = accountRepository.findById(loginAccountId)
.orElseThrow(() -> new NonExistResourceException("해당 id를 갖는 Account를 찾을 수 없습니다."));
String storeFilePath = fileProcessor.storeFile(multipartFile, profileImgPath);
account.updateProfileImg(storeFilePath);
File profileImgFile = new File(profileImgPath + account.getProfileImgName());
if (profileImgFile.exists()) {
profileImgFile.delete();
}
}
매개변수로 받은 MultipartFile를 저장하고 id로 찾아진 Account의 profileImg를 새로 저장된 이미지 이름으로 변경한다.
이후 기존의 profileImgFile을 삭제한다.
마지막에 profileImgFile을 삭제하는 이유는 다음과 같다.
만약 기존 프로필 이미지 삭제 시 에러가 발생했다고 하자. 이 경우 프로필 이미지 수정이 안 되는 경우가 발생해선 안된다.
클라이언트 입장에서 프로필 이미지 수정이 문제없이 실행될 수 있다면 기존의 프로필 이미지가 삭제되는지 마는지는 전혀 상관없기 때문이다.
따라서 마지막에 profileImgFile을 삭제한다.
□ updatePassword
[updatePassword]
@Transactional
public void updatePassword(Long loginAccountId, String updatedPassword) {
Account account = accountRepository.findById(loginAccountId)
.orElseThrow(() -> new NonExistResourceException("해당 id를 갖는 Account를 찾을 수 없습니다."));
String password = bCryptPasswordEncoder.encode(updatedPassword); //[1]
account.updatePassword(password);
}
id로 찾아진 Account의 password를 매개변수로 받은 password로 변경한다.
● [1] : Account의 password는 암호화되서 저장되어야 하기 때문에 변경할 password를 암호화한다.
□ 전체 코드
[AccountService 전체 코드]
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class AccountService {
private final AccountRepository accountRepository;
private final FileProcessor fileProcessor;
private final BCryptPasswordEncoder bCryptPasswordEncoder;
@Value("${file.profile}")
private String profileImgPath;
@Transactional
public void createAccount(Account account){
accountRepository.save(account);
}
public Account findByNickname(String nickname) {
return accountRepository.findByNickname(nickname)
.orElseThrow(() -> new NonExistResourceException("해당 nickname을 갖는 Account를 찾을 수 없습니다."));
}
public Account findById(Long accountId) {
return accountRepository.findById(accountId)
.orElseThrow(() -> new NonExistResourceException("해당 accountId를 갖는 Account를 찾을 수 없습니다."));
}
public List<Account> findAll() {
return accountRepository.findAll();
}
public QueryResults<Account> findAccountByPage(AccountSearchCond accountSearchCond, Pageable pageable) {
return accountRepository.findAccountsByPage(accountSearchCond, pageable);
}
@Transactional
public void updateInfo(Long loginAccountId, Account toAccount) {
Account account = accountRepository.findById(loginAccountId)
.orElseThrow(() -> new NonExistResourceException("해당 id를 갖는 Account를 찾을 수 없습니다."));
account.updateInfo(toAccount);
}
@Transactional
public void updateProfileImg(Long loginAccountId, MultipartFile multipartFile) throws IOException {
Account account = accountRepository.findById(loginAccountId)
.orElseThrow(() -> new NonExistResourceException("해당 id를 갖는 Account를 찾을 수 없습니다."));
String storeFilePath = fileProcessor.storeFile(multipartFile, profileImgPath);
account.updateProfileImg(storeFilePath);
File profileImgFile = new File(profileImgPath + account.getProfileImgName());
if (profileImgFile.exists()) {
profileImgFile.delete();
}
}
@Transactional
public void updatePassword(Long loginAccountId, String updatedPassword) {
Account account = accountRepository.findById(loginAccountId)
.orElseThrow(() -> new NonExistResourceException("해당 id를 갖는 Account를 찾을 수 없습니다."));
String password = bCryptPasswordEncoder.encode(updatedPassword);
account.updatePassword(password);
}
}
'프로젝트 > PongGame' 카테고리의 다른 글
myLogin (0) | 2022.05.18 |
---|---|
Account Controller (0) | 2022.05.11 |
Account_exceptionHandler (0) | 2022.05.11 |
Account Validation (0) | 2022.05.10 |
Account Repository (0) | 2022.05.10 |
댓글