JAVA로 웹 만들어보면서 DI 의 필요성 느끼기

박경현·2023년 3월 8일
0
post-thumbnail

백엔드로 취업을 하려면 spring을 해야한다는 걸 좀 깨닫고 김영한님의 스프링 강의를 사서 듣게 되었다.

그래서 블로그에 김영햔님 강의에 나온 왜 DI가 필요한지,
클린코드의 원칙인 SOLID를 어떻게 코드에 녹일 수 있는지를 적어보았다.

DI로 작성한 코드 깃허브 주소!

스프링의 핵심가치

그 언어나 프레임워크를 할때 왜 이걸 만들었을까? 를 생각하면 원작자의 의도를 알 수가 있다!

진짜 핵심!

스프링은 자바 언어 기반의 프레임워크 -> 객체지향언어!
객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크이다!
좋은 객체지향 어플리케이션을 개발 하도록 도와주는 프레임워크!

객체지향 프로그래밍

그렇다면 객체지향의 특징은 무엇이 있을까?

객체지향 프로그래밍

객체들의 모임으로 데이터를 주고 받고 처리!,
유연하고 변경이 용이해서 대규모 프로젝트에서 사용!,
컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법!

다형성(Polymorphism)!

역할과 구현으로 세상을 구분하자!! (인터페이스가 역할이고 , 객체가 구현이다!)

운전자 - 자동차

  • 각자의 역할이 있음! -> 자동차 구현(k3,테슬라)
    운전자가 K3타다가 테슬라타도 운전자 자체에는 영향이 없다! (면허를 다시 따기 등)

  • 이렇듯 운전자는 자동차의 역할이라는 큰 틀만 알고 있으면 된다! -> 자동차 내부 몰라도됨!

즉 클라이언트에 영향을 주지 않고 인터페이스라는 역할에 맞는 새로운 객체를 추가할 수 있다

자바 언어는 다형성으로 이것을 보여준다!

  • 역할 = 인터페이스를 구현한 클래스
    구현 = 객체,

  • 객체를 만들기 전 인터페이스 설계 매우 중요!!
    자바는 오버라이딩으로 다형성을 구현한다!

좋은 객체지향 설계의 5가지 원칙 - SOLID

그렇다면 어떻게 해야 객체지향적으로 설계를 잘한걸까?
이건 SOLID라는 줄임말을 하나씩 풀어보면 된다!

SRP(single responsibility principle)

첫번째 S인 SRP이다!!
하나의 클래스는 한가지 책임만을 가진다는 의미!(문맥이 모호!)

이때 중요한 기준은 파급효과가 다른 부분들에 적어야한다!
내가 새로운 객체생성을 했다고 해서 다른 객체들에 영향이 가면 안된다!

OCP- 개방 폐쇄 원칙!! 중요!!

소프트웨어 요소는 확장에는 열려있고, 변경은 닫혀있어야한다!!

이 코드를 보면 클라이언트인 MemberService에서
다른 JdbcMemberRepository()로 직접 바꿔준다!

즉 구현 객체를 변경하려면 클라이언트 코드에 손을 댄다! -> 변경 닫혀있어야 한다는 멘트에 위반!

스프링에서 객체를 생성하고 연관관계를 맺어주는 별도의 조립을 해준다!
이게 나중에 DI랑 큰 관련이 있음!

LSP - 리스코프 치환 원칙

자동차 인터페이스 존재 -> 악셀 기능 구현함!

근데 악셀 밟으면 앞이 아닌 뒤로 가는 차를 만들었다면?

  • 오류는 안남,, 하지만 다른 자동차들과 규약이 달라짐!
    LSP위반!, 즉 인터페이스 규약을 따르자!

ISP - 인터페이스 분리 원칙

세세하게 인터페이스도 분리하자! - 모호하게 큰 덩어리 말고!

자동차 인터페이스, -> 운전 인터페이스 , 정비 인터페이스

사용자 인터페에스 -> 운전자클라, 정비 클라로 분리!

DIP - 의존관계 역전원칙! 이것도 중요!

추상화에 의존해야지 구체화에 의존하면 안된다!
이것도 DI랑 관련이 크다!

인터페이스에 의존해라!, 역할에 의존해라!

MemberRepository m = new MemoryMemberRepository(); // DIP위반!
인터페이스랑 객체 둘 다 의존해서!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글