spring-god-study / spring-basic

김영한님 스프링 기본 강의를 듣고 서로 인증하고 힘을 내며 잇쌰잇쌰하는 프로젝트
0 stars 3 forks source link

2021.07.30 (금) 인증 #28

Open kyupid opened 3 years ago

kyupid commented 3 years ago

객체지향 5대원칙 코드로 설명해주시면서 자세히 알려주시는데 이해가 잘 안간다.

public class OrderServiceImpl implements OrderService { // OrderService는 인터페이스

    private final MemoryMemberRepository memberRepository = new MemoryMemberRepository();
    private final DiscountPolicy discountPolicy = new RateDiscountPolicy();

    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {
        // 구현코드
    }
}

가령 코드를 보여주시면서 이때 _OrderServiceImpl_은 DIP 원칙에 어긋난다고 하시는데, 왜냐하면 _OrderServiceImpl_은 DisCountPolicy 인터페이스에만 의존하는게 아니라 _RateDiscountPolicy_에도 의존을 하고 있고 구현체를 변경했을경우에, _DisCountPolicy_를 구현하고있는 또 다른 구현체인 _FixDiscountPolicy_를 구현하고 있기때문에 DIP 원칙에 어긋난다는 것이다.

DIP 원칙은 의존성역전의원칙

  • 상위 모듈은 하위 모듈의 구현에 의존해서는 안 된다.
  • 하위의 모듈이 상위 모듈에 정의한 추상 타입에 의존 해야한다.

출처: https://cheese10yun.github.io/spring-solid-dip/

위에 있는 코드로 예시를 들자면 상위모듈이라는 것은 할인 정책이 될것이고, 하위모듈은 각 세부적인 _RateDiscountPolicy_나 FixDiscountPolicy 같은 클래스가 하위 모듈이 될것이다.

상위 모듈은 하위 모듈의 구현에 의존해서는 안된다는 것은 상위 모듈인 _OrderServiceImpl_이 하위모듈인 _RateDiscountPolicy_와 _FixDiscountPolicy_에 의존해서는 안된다는 말이다. 그래서 DIP -> 의존성을 역전했다는 말은 아직까지도 이해가 안가긴하지만..

dnjsrud3407 commented 3 years ago

강의명 : 스프링 MVC 1편 수강 회차 <스프링 MVC - 구조 이해> 스프링 MVC 가 어떻게 구성되었는지 알아보았다 자세한 기능은 다음에 들어보도록 하자

강의명 : 스프링 입문 수강 회차 <프로젝트 환경설정> 스프링 MVC 1편을 통해서 스프링 프레임워크를 직접 만들어보았다 이 과정을 다 거치고 난 후 스프링 입문 편을 들으니 @Controller 나 @GetMapping 이 무엇인지 알아볼 수 있었다

프로젝트에 직접 적용해보려니,, 수강 순서가 뒤죽박죽이다 일단 스프링 입문 복습을 통해 간단하게 스프링을 정리해보고 스프링 MVC 1편부터 다시 꼼꼼하게 복습해보자

juvelop17 commented 3 years ago

자바 코드로 직접 스프링 빈 등록하기

스프링 빈 설정방법

참고: XML로 설정하는 방식도 있지만 최근에는 잘 사용하지 않으므로 생략한다.

DI 주입 방법

참고: DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다.

참고: 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다. -> 상황에 따라 DB를 연결할 경우 사용

주의: @Autowired 를 통한 DI는 helloConroller , memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다. -> 컴포넌트 스캔이 되지 않은 클래스의 @Autowired는 동작하지 않는다.

회원 관리 예제 - 웹 MVC 개발

회원 웹 기능 - 홈 화면 추가

[image:300B4D9B-EECA-4652-9EAD-9FB5E79CE55C-74013-000010B31FFBD5A9/Untitled 2.png]

참고: 컨트롤러가 정적 파일보다 우선순위가 높다.

회원 웹 기능 - 등록

*redirect:/ : / 로 이동

동작과정

  1. @GetMapping에 의해서 /members/new로 이동
  2. return에서 members/createMemberForm.html 파일 렌더링
  3. <form action=“/members/new” method=“post”>에서 post 방식으로 /members/new로 폼 전송
  4. Form 클래스의 setter를 통해 변수값이 입력됨
  5. @PostMapping에서 폼을 수신하고 회원 등록

회원 웹 기능 - 조회

동작과정

  1. @GetMapping에서 /members로 이동
  2. model.addAttribute(“members”, members)로 모델에 members 입력
  3. return에서 members/memberList 파일 렌더링
  4. html에서 members 변수 호출
    <tr th:each="member : ${members}">
    <td th:text="${member.id}"></td>
    <td th:text="${member.name}"></td>
    </tr>