@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을 별도로 붙여줘서 사고를 예방함