본문 바로가기
Develop/Spring

[Spring] Spring 프로젝트 개선하기 - 인터페이스/클래스 분리

by 코딩의성지 2020. 3. 25.

하이 ~~ !!!

 

지난 포스팅에서 REST 에서 CRUD 를 구현해봤다.

 

오늘은 실무에서 자주 볼 수 있는 형태의 패턴을 공개할거다. ㅎㅎ

 

먼저 혹시 CRUD 구현 안해본사람은 아래링크 보고 따라 개발해보고 오자.

 

https://devkingdom.tistory.com/110

 

[Spring] REST에서 CRUD 구현하기

하이 ㅎㅎㅎ 요즘 날씨 진짜 진짜 좋다 ~~!! ㅎㅎ 오늘은 그 동안 갈고 닦은 기본기(?) 를 바탕으로 CRUD를 정석대로 구현해볼꺼다. 다들 잘 따라해보고, 나중에 Spring으로 API 만들거나 웹서비스 만들 때 잘 사..

devkingdom.tistory.com

위의 링크에서 보면 UserService나 UserDao에 로직을 다 구현해 놓았다.

 

하지만 이를  인터페이스와 서비스로 분리하는 것이 좋다. 이렇게 분리를 해놓으면 확장성과 유연성이 좋아진 코드를 작성할 수 있다. 

 

지금 회원관리 모듈을 만들 수 있는데, 이 회원관리 모듈을 어떤서비스든지 커스터마이징해서 사용할 수 있게된다는 이야기이다.

 

전체 구성은 아래와 같이 구성될 것이다.

 

실제 소스를 보자.

 

 

 

Service

 

UserService는 이제 인터페이스로 스펙을 정의만 해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import org.springframework.stereotype.Service;
 
 
@Service
public interface UserService {
 
    public List<User> getAllUsers();
 
    public User getUserByUserId(String userId);
 
    public User registerUser(User user);
 
    public void modifyUser(String userId, User user);
 
    public void removeUser(String userId);
}
 

 

그리고 실제 구현은 위의 인터페이스를 구현한 클래스로 만들어지는데, 해당 서비스를 구현했다는 의미로 뒤에 Impl을 붙인 UserServiceImpl로 명명했다. 실제로 이전에 서비스에서 하던 일들을 여기서 해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import org.springframework.stereotype.Service;
 
 
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserDao userDao;
 
    @Override
    public List<User> getAllUsers() {
        return userDao.getAllUsers();
    }
 
    @Override
    public User getUserByUserId(String userId) {
        return userDao.getUserByUserId(userId);
    }
 
    @Override
    public User registerUser(User user) {
        return userDao.insertUser(user);
    }
 
    @Override
    public void modifyUser(String userId, User user) {
        userDao.updateUser(userId, user);
    }
 
    @Override
    public void removeUser(String userId) {
        userDao.deleteUser(userId);
    }
}
 

 

 

 

 

DAO

 

DAO도 마찬가지다.

 

아래 소스는 UserDao 인터페이스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.stereotype.Repository;
 
 
@Repository
public interface UserDao {
 
    public List<User> getAllUsers();
 
    public User getUserByUserId(String userId);
 
    public User insertUser(User user);
 
    public void updateUser(String userId,User user);
 
    public void deleteUser(String userId);
}
 

 

그리고 해당 인터페이스를 구현한 UserDaoImpl 클래스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import org.springframework.stereotype.Repository;
 
 
@Repository
public class UserDaoImpl implements UserDao {
    public static List<User> users;
 
    //실제 데이터는 DB에서 가져오는게 맞으나 .... 아직 DB가 없으니 임시로 세팅해놓음
    static {
        users = new ArrayList<>();
        users.add(new User(1,"testName1","testId1""1234"));
        users.add(new User(2,"testName2","testId2""1234"));
        users.add(new User(3,"testName3","testId3""1234"));
        users.add(new User(4,"testName4","testId4""1234"));
        users.add(new User(5,"testName5","testId5""1234"));
    }
 
    // Select all user.
    @Override
    public List<User> getAllUsers() {
        return users;
    }
 
    // Select one user by userId
    @Override
    public User getUserByUserId(String userId) {
        return users
                .stream()
                .filter(user -> user.getUserId().equals(userId))
                .findAny()
                .orElse(new User(-1""""""));
    }
 
    // Insert User
    @Override
    public User insertUser(User user) {
        users.add(user);
 
        return user;
    }
 
    // Modify User
    @Override
    public void updateUser(String userId,User user) {
        users.stream()
                .filter(curUser -> curUser.getUserId().equals(userId))
                .findAny()
                .orElse(new User(-1""""""))
                .setUserName(user.getUserName());
    }
 
    // Delete User
    @Override
    public void deleteUser(String userId) {
        users.removeIf(user -> user.getUserId().equals(userId));
    }
}
 

 

다들 본인의 코드를 개선해보자. 그럼 즐거운 코딩~

반응형

댓글