본문 바로가기
[SpringBoot]

SpringBoot 간단 실습 - 1 엔티티 생성 / 서비스 생성

by Hevton 2022. 12. 4.
반응형

 

이전 글에 이어서,

 

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 이라고 한다. 추구 유지보수를 위해서 이렇게 구분해 놓는 것이 좋은 습관이다!

 

반응형