본문 바로가기
프로젝트/PongGame

Account Service

by 히포파타마스 2022. 5. 11.

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

댓글