ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링] 핵심 원리 이해 - 객체 지향 원리
    BackEnd/Spring 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());
        }
    }

     

    정리

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

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

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

Designed by Tistory.