이전 글에 이어서,
entity 패키지를 하나 추가해준 뒤에, User 클래스를 생성한다.
@Getter는 lombok에서 제공해주는 기능인데,
필드들의 Get 메서드를 자동으로 만들어주는 기능을 제공해주는 어노테이션이다.
이전 글에서 dependencies를 통해 lombok을 받았는데, 필드.get 메서드 자동완성이 동작하지 않는 것 같다면,
아직 IntelliJ에 정상적으로 플러그인이 설치되지 않았을 수도 있다.
잘 된다면야 상관없지만, 안된다면 아래 내용을 참고하면 된다.
IntelliJ -> Preferences -> Plugins
이렇게 다운받아주면 된다.
User 클래스를 정의한다
package com.test.admin.entity;
import com.google.gson.Gson;
import lombok.Getter;
import java.util.UUID;
@Getter
public class User {
String id;
String name;
String email;
public User() {
this.id = UUID.randomUUID().toString();
}
public User(String name, String email) {
this();
this.name = name;
this.email = email;
}
public static User sample() {
return new User("Park", "Park@gmail.com");
}
public static void main(String args[]) {
User user = new User("Kim", "Kim@gmail.com");
System.out.println(new Gson().toJson(user));
}
}
main 함수를 정의해 준 이유는, 테스트를 간단히 진행해 보기 위함일 뿐이다.
Gson 라이브러리는 객체를 json으로 convert 시켜주는데에 사용된다.
구글에 Gson dependency를 검색해서 dependency 문을 알아온 뒤에 build.gradle에 추가해주면 된다.
https://mvnrepository.com/artifact/com.google.code.gson/gson
Repository 패키지를 추가해준 뒤에, UserRepository 인터페이스를 추가한다.
package com.test.admin.repository;
import com.test.admin.entity.User;
import java.util.List;
public interface UserRepository {
String create(User newUser);
void update(User newUser);
void delete(String id);
User retrieve(String id);
List<User> retrieveAll();
}
그리고 이제 같은 경로에, UserRepositoryLogic 클래스를 추가한다.
이 클래스는, 방금 정의한 UserRepository 인터페이스를 구현할 것이다.
UserRepository에 커서를 두고
MAC : cmd + enter
Window : Alt + enter
해주면
Implement method가 나온다. 이걸 누르면 된다.
그리고 코드를 손봐준다
package com.test.admin.repository;
import com.test.admin.entity.User;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Repository
public class UserRepositoryLogic implements UserRepository{
private Map<String, User> userMap;
public UserRepositoryLogic() {
this.userMap = new HashMap<>();
}
@Override
public String create(User newUser) {
this.userMap.put(newUser.getId(), newUser);
return newUser.getId();
}
@Override
public void update(User newUser) {
this.userMap.put(newUser.getId(), newUser);
}
@Override
public void delete(String id) {
this.userMap.remove(id);
}
@Override
public User retrieve(String id) {
return userMap.get(id);
}
@Override
public List<User> retrieveAll() {
return userMap.values().stream().collect(Collectors.toList());
}
}
HashMap을 이용해서 In Memory로 DB를 구현한 느낌을 냈다.
이제 서비스를 구현한다. service 패키지 아래에, UserService 인터페이스를 정의해준다
package com.test.admin.service;
import com.test.admin.entity.User;
import java.util.List;
public interface UserService {
String register(User newUser);
void modify(User newUser);
void remove(String id);
User find(String id);
List<User> findAll();
}
그리고 이 UserService를 구현하는 구현체, UserServiceLogic 클래스를 또 생성하여 작성해준다.
package com.test.admin.service;
import com.test.admin.entity.User;
import com.test.admin.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
// UserServiceLogic도 bean 객체로 등록하기 위해 @Service
@Service
@RequiredArgsConstructor
public class UserServiceLogic implements UserService{
// DI 적용 방법
// UserRepository를 구현한 구현클래스 UserRepositoryLogic을 찾아서 userRepositry 변수에 주입함.
// @Autowired
// private UserRepository userRepository;
// DI 적용 방법 1
// UserRepository를 구현한 구현클래스 UserRepositoryLogic을 찾아서 userRepositry 변수에 주입함.
private final UserRepository userRepository; // @RequiredArgsConstructor와 세트
@Override
public String register(User newUser) {
return this.userRepository.create(newUser);
}
@Override
public void modify(User newUser) {
this.userRepository.update(newUser);
}
@Override
public void remove(String id) {
this.userRepository.delete(id);
}
@Override
public User find(String id) {
return this.userRepository.retrieve(id);
}
@Override
public List<User> findAll() {
return this.userRepository.retrieveAll();
}
}
이렇게, Service나 Repository 클래스를 바로 정의하지 않고 interface를 두고 구현체를 따로 두는 방법을
loose-coupling 이라고 한다. 추구 유지보수를 위해서 이렇게 구분해 놓는 것이 좋은 습관이다!
'[SpringBoot]' 카테고리의 다른 글
SpringBoot 간단 실습 - 2 단위 테스트 (0) | 2022.12.09 |
---|---|
@Autowired 의존성 주입이 안된다면 / NULL (0) | 2022.12.08 |
SpringBoot 프로젝트 생성하기 (0) | 2022.12.03 |
@RequestMapping을 사용하는 이유 (0) | 2022.12.01 |
Controller vs RestController 어노테이션 차이 (0) | 2022.12.01 |