BackEnd/Spring

[스프링] 핵심 원리 이해 - 객체 지향 원리

chjs93 2022. 5. 13. 01:02

스프링 핵심 원리 - 기본편 (인프런) 강의를 듣고 느낀점을 정리한 글입니다.

 

스프링 원리 그리고 객체 지향의 원리

  • 스프링 원리를 이해하기 위해서는 객체지향 원리를 잘 파악해야한다.

 

객체 지향의 뜻

위키백과를 참고하면.

객체 지향 프로그래밍은 컴퓨터 프로그래밍의 패러다임의 하나이고,

컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임 으로 파악하고자 하는 것이다.

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.

 

객체 지향 설계에 고려해야할 조건들

  • 역할과 구현을 분리했나?
  • 다형성을 활용하고, 인터페이스와 구현 객체를 분리했나(상속)?
  • OCP, DIP 등과 같은 설계 원칙을 충실히 준수했나?

 

좋은 객체지향 설계 5원칙

  • SRP 단일 책임 원칙
    • 한 클래스는 하나의 책임만 가져야 한다.
  • OCP 개방-폐쇄 원칙
    • 확장에 열려있고 변경에는 닫혀 있어야 한다. (다형성)
  • LSP 리스코프 치환 법칙
    • 부모 클래스 대신 자식 클래스를 넣어도 제대로 동작한다.
  • ISP 인터페이스 분리 원칙
    • 인터페이스를 잘게 쪼개자
  • DIP 의존관계 역전 원칙
    • 프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.

 

원칙을 지켜 만든 샘플 클래스

  • MemberRepository
public interface MemberRepository {

    void save(Member member);

    Member findById(Long memberId);
}
  • MemoryMemberRepository
public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}
  • MemberService
public interface MemberService {

    void join(Member member);

    Member findMember(Long memberId);
}
  • MemberServiceImpl
public class MemberServiceImpl implements MemberService {

    private MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}
  • AppConfig
public class AppConfig {

    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
  • MemberApp (테스트를 위한 실행 클래스)
    public static void main(String[] args) {
        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();

        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);
        System.out.println("new member = " + member.getName());
        System.out.println("find Member = " + findMember.getName());
    }
}

 

IoC, DI, 컨테이너

스프링은 좋은 객체 지향 설계를 돕기 위해 만들어진 프레임워크이다.

프레임워크 vs 라이브러리

내가 작성한 코드를 제어하고 대신 실행하면 -> 프레임워크 (JUnit)

내가 작성한 코드가 직접 제어의 흐름을 담당한다면 -> 라이브러리

  • 프로그램의 제어 흐름을 외부에서 관리하기 -> IoC
  • 애플리케이션 실행시점(런타임) 에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결됨 -> DI
  • 객체를 생성하고 관리하며 의존관계를 연결해주는 존재 -> 컨테이너 (DI 컨테이너)
    • 위의 AppConfig 클래스가 컨테이너 역할을 하며 IoC, DI 를 가능하게 해준다.

 

자바에서 스프링으로

  • 자바 코드로 모든것을 구현한다면 제어, 객체 관리 등을 직접 해야한다.
  • 스프링은 컨테이너에 객체를 스프링빈(@Bean) 으로 등록하고 객체를 사용할때는 스프링 빈에서 찾아 사용하도록 변경하는 것이다.
  • AppConfig - 스프링 컨테이너에 설정정보(@Configuration) 를 등록하고 @Bean으로 관리한다.
@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
  • MemberApp - ApplicationContext 로 설정정보를 가져와 원하는 객체를 가져와 로직을 수행한다.
public class MemberApp {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);

        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);
        System.out.println("new member = " + member.getName());
        System.out.println("find Member = " + findMember.getName());
    }
}

 

정리

스프링 원리 이전에 객체 지향 원리에 대해 먼저 파악하자

스프링은 결국 객체 지향을 도와주는 프레임워크이다. (자바를 자바답게)

스프링 == 객체를 관리 프레임워크