프로그래밍 언어/Spring

<Spring>LMS프로젝트4. 학생 출결 로직 작성(2)OCP,DIP 준수하게 수정

창조적생각 2021. 10. 29. 14:53

 

*본 프로젝트는 JSP 팀 프로젝트로 만들었던 Learning Management System을 Spring으로 이식하는 과정입니다.

**본 프로젝트는 김영한 선생님의 인프런 강의 스프링 핵심원리 - 기본편

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 개발자가 되어보세요! 📣 확인해주

www.inflearn.com

을 바탕으로 실습하는 과정입니다. 스프링에 대해서 배우고 싶으시다면 이 강의를 들어보시는 것도 좋을 것입니다.

 

개발 환경

IDK : intelliJ

JDK : 자바 11

의존성은 김영한 선생님의 강의 순서대로 하기 위해 아무것도 넣지 않고 시작한다.

 

이전에 학생의 출결정보를 입력하는 로직을 작성했지만. 좋은 객체지향 설계를 위한 원칙을 지키지 않았다.

그렇기에 개방- 폐쇄의 원칙(OCP)와 의존관계 역전 원칙(DIP)까지도 모두 지키는 코드로 수정한다.

 

1. 사용과 구성 영역으로의 분리

2. AttendService 생성자 주입 방식으로 변경

 

1. 사용영역과 구성 영역으로의 분리

 

AppconFig 클래스를 만들어 전체 인터페이스들의 구현을 담당하게 한다.

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
package eleven.lms;
 
import eleven.lms.attend.AttendRepository;
import eleven.lms.attend.AttendService;
import eleven.lms.attend.AttendServiceImpl;
import eleven.lms.attend.MemoryAttendRepository;
import eleven.lms.attendrule.AttendPolicy;
import eleven.lms.attendrule.OneDayPolicy;
import eleven.lms.member.MemberRepository;
import eleven.lms.member.MemberService;
import eleven.lms.member.MemberServiceImpl;
import eleven.lms.member.MemoryMemberRepository;
 
import java.text.ParseException;
 
public class AppConfig {
 
    public MemberService memberService(){//MemberService의 구현체 선택
        return new MemberServiceImpl(memberRepository());
    }
 
    public MemberRepository memberRepository(){// 위에서 사용될 memberRepository의 구현체를 선책해준다.
        return new MemoryMemberRepository();
    }
//attend 구성
    public AttendRepository attendRepository(){
        return new MemoryAttendRepository();
    }
    public AttendService attendService() throws ParseException { //생성자 주입
        return new AttendServiceImpl(attendPolicy());
    }
    public AttendPolicy attendPolicy() throws ParseException {
        return new OneDayPolicy();
    }
 
}
cs

 

그렇게 함으로써 사용 영역에서는 인터페이스에만 의존하게 하고 따로 구성을 변경하기 위해 코드를 변경할 필요가 없어진다.

 

2. 생성자 주입

변경 전 <Class AttendServiceImpl>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class AttendServiceImpl implements AttendService {
    AttendPolicy attendPolicy = new OneDayPolicy(); // 직접 구현체를 내용부분에서 
 
    public AttendServiceImpl() throws ParseException {
    }
 
    @Override
    public void CreateAttend(MemberAttend memberAttend) {
        memberAttend.setAttendStandard(attendPolicy.JudgeAttend(memberAttend));
    }
 
    @Override
    public String findById(String MemberId) {
        return null;
    }
}
cs

AttendPolicy 인터페이스를 AttendServiceImpl안에서 직접 구현을 함으로써 내용이 수정되면 AttendServiceImpl 클래스 내에서 수정을 가해야 함으로 OCP 위반이다.

 

그러므로 생성자 주입 방식으로 AppConfig를 통해 의존성을 주입받도록 변경한다.

 

변경 적용 된<Class AttendServiceImpl>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package eleven.lms.attend;
 
import eleven.lms.attendrule.AttendPolicy;
import eleven.lms.attendrule.OneDayPolicy;
 
import java.text.ParseException;
 
public class AttendServiceImpl implements AttendService {
    AttendPolicy attendPolicy;
 
    public AttendServiceImpl(AttendPolicy attendPolicy) throws ParseException {
        this.attendPolicy = attendPolicy;
   } //AttendPolicy를 매개로 하는 생성자 생성
 
    @Override
    public void CreateAttend(MemberAttend memberAttend) {
        memberAttend.setAttendStandard(attendPolicy.JudgeAttend(memberAttend));
    }
 
    @Override
    public String findById(String MemberId) {
        return null;
    }
}
cs

 

 

 

 

 

 

 

 

 

728x90