Search
Duplicate

[스프링 게시판] Repository, Service 클래스 작성

@3/8/2023
본격적으로 코딩을 시작함
깃에 모든 수정 사항을 잘게 커밋하면서 진행함
깃에 서툴다보니 깃을 다시 공부하는 시간이 더 길었던 것 같음. 언제쯤 깃과 친해질 수 있을까?

Repository

일단 User, Post, Comment 세 엔티티 모두 아래와 같이 Repository를 만듦
package dev.gyuray.forum.repository.user; import dev.gyuray.forum.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import java.util.List; import java.util.Optional; @Repository @RequiredArgsConstructor public class UserRepository { private final EntityManager em; public User save(User user) { em.persist(user); return user; } public Optional<User> findOne(Long userId) { return Optional.ofNullable(em.find(User.class, userId)); } public void update(UserUpdateDTO userUpdateDTO) { User user = em.find(User.class, userUpdateDTO.getId()); user.setAddress(userUpdateDTO.getAddress()); user.setRole(userUpdateDTO.getRole()); user.setPosts(userUpdateDTO.getPosts()); user.setComments(userUpdateDTO.getComments()); } public Optional<User> findByName(String name) { return Optional.ofNullable( em.createQuery("select u from User u where user_name = :name", User.class) .setParameter("name", name) .getSingleResult()); } public List<User> findAll() { return em.createQuery("select u from User u") .getResultList(); } public void delete(Long userId) { User foundUser = em.find(User.class, userId); em.remove(foundUser); } }
Java
복사
Update 시 DTO를 통해서 업데이트할 부분만 수정되도록 각 엔티티마다 수정용 DTO를 만듦

Service

일단 User, Post, Comment 세 엔티티 모두 아래와 같이 만듦
package dev.gyuray.forum.service.user; import dev.gyuray.forum.domain.Address; import dev.gyuray.forum.domain.User; import dev.gyuray.forum.repository.user.UserRepository; import dev.gyuray.forum.repository.user.UserUpdateDTO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; public Long join(UserForm userForm) { if (userRepository.findByName(userForm.getName()).isPresent()) { throw new IllegalStateException("이미 존재하는 회원입니다"); } Address address = new Address(); address.setCity(userForm.getCity()); address.setStreet(userForm.getStreet()); address.setZipcode(userForm.getZipcode()); User user = new User(); user.setName(userForm.getName()); user.setAddress(address); user.setEmail(userForm.getEmail()); user.setRegDate(userForm.getRegDate()); userRepository.save(user); return user.getId(); } public User findUser(Long userId) { return userRepository.findOne(userId).orElseThrow(() -> { throw new IllegalStateException("해당 ID를 가진 유저가 없습니다"); }); } public List<User> findUsers() { return userRepository.findAll(); } @Transactional public void updateUser(UserUpdateDTO userUpdateDTO) { userRepository.update(userUpdateDTO); } @Transactional public void withdraw(Long userId) { userRepository.delete(userId); } }
Java
복사
회원 등록용 DTO는 Form이라고 이름 붙여서 사용함
처음에 join 메서드에 void를 리턴했다가, form을 사용할 경우 join 메서드는 id를 리턴해야하는 것을 깨닳고 수정함
Form을 User로 바꿔 Repository에 넘겨줌
읽기 전용 @Transactional을 클래스 계층에 붙이고 쓰기 작업을 하는 메서드에는 @Transacional을 별도로 붙여줘서 사고를 예방함