풀잎스쿨 4주차 리뷰

Jake·2022년 10월 15일
0

풀잎스쿨

목록 보기
4/6
post-thumbnail

10/4

이번 발표는 4주차 였으며 jh님이 김영한님의 강의를 참고하여 스프링에 대해서 아주 자세히 발표를 해주셨다

풀잎스쿨이란 ?
Flipped school
Flipped learning 방식으로 함께 공부하며 성장하는 스터디 모임이에요. (기수제 I 8주 또는 11주)

어려운 DI 개념과 전체적인 백엔드의 흐름 그리고 스프링의 큰 그림을 예시를 통해 알려주셨는데 헷갈렸던 개념들이 조금은 정리가 되었다.

발표자료는 Github 를 참고하기 바란다.

강의는 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 을 참고하였다.

내용은 크게 아래와 같이 구성되어있다.

  1. 프로젝트 환경설정
  2. 스프링 웹 개발 기초
  3. DI 의존관계
  4. 스프링 DB 접근 기술
  5. AOP

프로젝트 환경설정

환경설정의 경우 스프링 부트로 하여 크게 어려움 없이 이해가 되었다.

다만 빌드환경같은 경우 레거시가 아닌 경우에는 왠만하면 gradle을 쓰는 추세로 바뀌었다고 하였다.

이유는 간단하게 아래와 같다

maven은 pom.xml(Project Object Model) 파일에서 build를 xml로 정의하므로 구조화하기 쉽지만 문서의 양이 비대해지므로
JVM 기반의 grooby를 사용하는 gradle에 비해 설정 내용이 길어지고 가독성이 떨어짐

웹 개발 기초

정적 콘텐츠, MVC, API에 대해 설명해주셨다.

여기서 MVC 방식으로 진행될 때 Controller, Model, view의 각각 역할에 대해서 아래와 같이 알 수 있었다.

  1. Model : 추출, 저장, 삭제 등 데이터를 처리하는 역할 (내부 비즈니스 로직)
  2. View : 사용자의 요청에 의해 가공된 정보를 출력하는 역할 (사용자 인터페이스)
  3. controller : 사용자의 요청(url)에 적절한 비즈니스 로직(서비스)을 호출하고 그 결과를 받아 뷰로 전달

웹 애플리케이션 계층 구조를 Controller, Service, Repository 로 나누어 설명하셨다.

위 흐름을 요리사와 손님, 메뉴등으로 설명을 해주시면서 아주 이해가 잘 되었다.

컨트롤러 = 웨이터, 서비스 = 요리사, 리포지토리 = 주방보조

컨트롤러는 서비스에게 요청을 하고 결과를 받아 클라이언트로 반환하는 역할을 하며

서비스는 실질적인 로직이며, 리포지토리로 필요한 데이터를 요청 및 컨트롤러에게 결과를 전달한다

리포지토리는 DB로부터 데이터를 받아온다.

DI 의존관계

악명높은 DI(의존성 주입)를 양복예제를 통해 설명하셨다.

[객체를 직접 주입하는 경우]

//3. 양복 클래스에서 양복 객체에 메이커 명을 지어준다면,
public class Suit{
    private String name;

    public Suit(String name){
        this.name = name;
    }
}

//4. 사람A, 사람B 클래스에 있는 양복 객체에도 해당 변경사항을 적용해야함
public class HumanA{
    public Suit suit;
    
    public HumanA() {
        this.suit = new Suit(String name);
    }
}

public class HumanB{
    public Suit suit;
    
    public HumanB() {
        this.suit = new Suit(String name);
    }
}

[객체를 외부에서 주입하는 경우]

//3. 양복 클래스에서 양복 객체에 메이커 명을 지어줘도
public class Suit{
    private String name;

    public Suit(String name){
        this.name = name;
    }
}
Suit suit = new Suit(String name);

//4. 사람A, 사람B 클래스는 변경이 필요하지 않음
public class HumanA{
    public Suit suit;
    
    public HumanA(Suit suit) {
        this.suit = Suit;
    }
}

public class HumanB{
    public Suit suit;
    
    public HumanB(Suit suit) {
        this.suit = Suit;
    }
}

객체를 직접 생성하느냐, 외부에서 생성하여 주입을 해주느냐에 따라 이후 코드 수정시 아주 큰 차이가 있다는 것을 알게 되었다.

스프링 DI를 사용하면 기존코드를 전혀 손대지 않고 설정만으로 구현클래스를 변경할 수 있는 장점이 있다.

DB 접근기술

총 4가지가 있다

순수 JDBC
JDBC Template
JPA
Spring Data JPA

순수 JDBC - API로 코딩하는 것인데 20년 얘기로 참고만 하고 넘어가였다.

JDBC Template - 반복코드를 많이 제거해주었다지만 SQL은 직접 작성해야하는 어려움이 있다.

JPA - 기본적인 반복코드 제거와 SQL도 JPA가 직접 만들어서 실행해준다고 한다.

JPA를 사용하면 실질적인 서비스 로직에 집중할 수 있어 개발 생산성이 높아진다고 한다.

스프링 데이터 JPA

스프링 데이터 JPA를 사용하면 리포지토리에 구현 클래스 없이 인터페이스만으로도 개발을 완료할 수가 있어 개발 코드들이 확연하게 줄어든다고 한다. 그리고 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공하여 반복을 제거해준다고 한다.

AOP (관점 지향 프로그래밍, Aspect Oriented Programming)

공통 관심사항, 핵심 관심 사항을 분리하여 모듈화하는 것을 의미한다.

예제를 통해 알아보자

문제 - 시간을 측정하는 로직은 공통 관심 사항이라고 가정한다.

만약 시간을 측정하는 로직과 핵심 비즈니스 로직이 섞여있다면 ? → 유지보수가 어렵다.

해결방법

회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
핵심 관심 사항을 깔끔하게 유지할 수 있다.

0개의 댓글