본문 바로가기
Spring | SpringBoot

[스프링 스터디] 1주차 - 스프링 입문

by saniii 2022. 1. 13.

# 참고 강의 

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술  :  김영한님

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

# 공부한 코드를 올린 github

https://github.com/anso33/SpringStudy_first.git

 


# 1주차 정리 내용

01. 프로젝트 환경설정

 

+ 일반적으로 처음 프로젝트를 생성할 때 스프링부트 스타터를 이용한다. 보다 쉽게 build.gradle 파일을 완성할 수 있다. 

- 스프링부트 스타터 : https://start.spring.io 

근데 기존에 java8을 사용하고 있어서 나중에 java8로 바꿈(여러버전 관리하는 법 공부하기)


** 자바 여러버전 관리하는 법

https://jojoldu.tistory.com/329

https://llighter.github.io/install-java-on-mac/


** maven  VS gradle

 

+ 빌드 관리 도구

    : 빌드 자동화(컴파일, 패키징, 테스트)를 수행하여 실행가능한 프로그램으로 바꿔주는 도구

 

+ maven

    - 자바용 프로젝트 관리 도구

    - 사용할 라이브러리, 필요한 라이브러리를 네트워크를 통해 자동으로 다운

    - pom.xml을 이용한 정형화된 빌드 시스템.

    - pom : Project Object Model

 

* 동적인 build를 xml로 정의하기 어렵다. xml : 고정적, 선형적.

  // groovy를 사용하면 동적인 빌드는 직접 코드를 짤 수 있다. 

    - 설정 내용이 길어 가독성이 떨어짐.

    - 의존관계가 복잡할 경우 부적절.

 

 

+ gradle

    - Groovy(java 가상머신에서 실행되는 스크립트 언어)를 이용한 빌드 자동화 시스템

    - JAVA, C/C++, Python 등 다양한 언어를 지원

    - 스크립트 언어로 구성되어 if, else와 같은 로직을 구현할 수 있어 간결하다. 

    - maven보다 빠르다. // maven의 장점은 다 가졌다.  

    - 설정 주입 방식 (Configuration Injection)


+ 처음 프로젝트를 생성했을때 프로젝트의 가장 메인이 되는 -----Application.java에서 run하고 정상적으로 작동된다면

 

인터넷 주소창에 localhost:8080을 치고 이동했을 때 다음과 같이 작동한다. 

+ 스프링 프로젝트의 라이브러리를 살펴보자. 

> 스프링부트 라이브러리

- spring-boot-starter-web

        - spring-boot-starter-tomcat: 톰캣 (웹서버)

        - spring-webmvc: 스프링 웹 MVC

- spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)

- spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅

        - spring-boot

                - spring-core

                   // = spring container

                   // 스프링 프레임워크의 근간이 되는 요소

                   // DI 기능을 지원하는 영역을 담당

        - spring-boot-starter-logging

                - logback

                   // log4j의 단점을 개선하여 만든 자바 로깅 라이브러리

                - slf4j

                   // 자바의 로깅 관련 라이브러리들을 추상화시킨 인터페이스

(logback을 설치하고 로깅 라이브러리를 추상화시킨 slf4j를 dependency에 추가, 로깅은 slf4j 인터페이스를 통해서 수행)

 

> 테스트 라이브러리

- spring-boot-starter-test

        - junit: 테스트 프레임워크

        - mockito: 목 라이브러리

        - assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리

        - spring-test: 스프링 통합 테스트 지원

 

 

+ 스프링 부트가 제공하는 기능을 알고 싶을 때 

https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-welcome-page 에서 검색

 

+ thymeleaf 템플릿엔진 

    : 서버사이드 자바 템플릿 엔진의 한 종류

    : Servlet Code로 변환되지 않아 비즈니스 로직과 분리되어 View에 집중할 수 있다. 

        - Servlet 컨테이너의 개입없이 독자적으로 View를 완성할 수 있다. 

 

김영한님의 수업 자료


** 템플릿 엔진

  : 지정된 템플릿 양식과 데이터가 합쳐져 HTML문서를 출력하는 소프트웨어 

  : 웹사이트 화면의 형태를 만드는 것을 도와주는 양식

 

+ 서버 템플릿 엔진

  : 서버에서 가져온 데이터를 미리 정의된 템플릿에 넣어(java코드로 문자열을 만든 후)

    html으로 변환하여 클라이언트(브라우저)에 전달

  ex) 

 

+ 클라이언트 템플릿 엔진

  : 클라이언트(브라우저) 위에서 작동, 서버에서는 JSON, XML형식의 데이터만 전달.

  ex) 

 

[참고사이트]

https://imgzon.tistory.com/97 

https://velog.io/@dsunni/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-MVC-Thymeleaf  



02 스프링 웹 개발 기초

 

+ 정적 컨텐츠 

   : 변화가 없는, 실시간으로 변경되지 않는 데이터

   : 파일을 서버에서 조금 변형해서 그대로 웹브라우저로 전달

  ex) HTML , CSS , JavaScript , 이미지 , 비디오 

        프로젝트의 static폴더에 아무  html을 넣으면 이걸 그대로, 변형 없이 클라이언트(웹브라우저)로 전달

김영한님의 수업 자료

 

+ MVC (Model, View, Controller)

   : 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 SW 디자인 패턴

   : SW의 비즈니스 로직과 화면을 구분하는데 중점을 둔다. 

     // View : 화면을 그리는데 집중 // 나머지는 비즈니스 로직과 내부적인 요소에 집중

 

    - 모델: 데이터와 비즈니스 로직을 관리

    - : 레이아웃과 화면을 처리

    - 컨트롤러: 명령을 모델과 뷰 부분으로 라우팅

 

 - 역할을 나누어 각자의 역할에만 집중하므로 유지보수성, 애플리케이션의 확장성, 유연성이 증가

김영한님의 수업 자료

[참고]

https://developer.mozilla.org/ko/docs/Glossary/MVC  

https://m.blog.naver.com/jhc9639/220967034588 

 

 

 

+ API

  : 데이터를 전달

  : 클라이언트 친화적으로 전달하고자 하거나 서버끼리 통신할 때

 

 

김영한님의 수업 자료

 


03 회원관리 예제 - 백엔드 개발

 

+ 일반적인 웹 애플리케이션 계층 구조

    - Controller : 웹 MVC의 컨트롤러 역할

    - Service : 핵심 비즈니스 로직 구현

    - Repository : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리

    - Domain : 비즈니스 도메인 객체   // 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

김영한님의 수업 자료

 

+ 테스트 케이스 작성

 

- TDD (Test Driven Development : 테스트 주도 개발)

  : 테스트케이스를 작성한 후 실제 코드를 개발하여 리펙토링.

  : 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 투가하는 단계를 반복하여 구현

  - 코드의 버그가 줄고, 소스코드가 간결해진다. 

  >> TDD의 대표적인 Tool 'JUnit'

        : Java 단위 테스트 프레임워크

 

- BDD (Behavior Driven Development)

  : '행동'을 기준으로 하는 개발 방법론 - given, when, then

      - given : 초기 context 값, 특정 값이 주어지고
      - when : 테스트하려는 조건, 어떤 이벤트가 발생했을 때
      - then : 테스트 결과, 결과를 보장한다. 

 

 

[참고]

https://wooaoe.tistory.com/33  

https://velog.io/@y_dragonrise/Agile-TDD-BDD  

 

 

+ @Test

* 바로 테스트만들고 싶을 때 해당 class 에서 command + shift + T

 

+ @AfterEach

모든 test에서 test되는 메서드의 순서는 보장되지 않고 독립적으로 실행된다.
따라서 이름이 같을 경우 변수값때문에 test가 정상적으로 이루어지지 않아 test가 끝나면 clear해줘야함
clearStore() 와 afterEach()를 이용하여 clear!

  

+ @BeforeEach

프로젝트 생성할 때마다 독립적으로 객체 생성

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    //프로젝트 생성할 때마다 독립적으로 객체 생성
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

    @AfterEach
    public void afterEach() {
        memberRepository.clearStore();
    }

    @Test
    //회원가입
    void join() {
        //given
        Member member = new Member();
        member.setName("hello");

        //when
        Long saveId = memberService.join(member);

        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }
}

 


+ assert에 대해 AssertJ를 공부하자.

assertThat(result).isEqualTo(member); // 아래코드보다 이코드가 더 가독성이 좋다. 
//Assertions.assertEquals(member, result);

https://pjh3749.tistory.com/241  


test를 run하면 표시는 초록색으로 정상작동한다는 결과를 얻는데 창에는 빨간 글씨가 계속 뜨는 오류를 얻음.

 

해결방법 >> preference -> gradle로 들어가서 build and run using과 run tests using을 intelliJ IDEA로 변경한다. 

그럼 해결!!

 



04 스프링 빈과 의존관계

 

+ DI (Dependency Injection, 의존성 주입)

   : 외부에서 두 객체 간의 (의존)관계를 결정해주는 디자인 패턴

   : 인터페이스를 사이에 두어 클래스 레벨에서는 의존 관계가 고정되지 않도록 하고 런타임 시에 관계를 생성한다.

  • 의존 관계 설정이 컴파일시가 아닌 실행시에 이루어져 모듈간의 결합도를 낮출 수 있다.
  • 코드 재사용을 높여 작성된 모듈을 여러 곳에서 소스코드의 수정 없이 사용할 수 있다.
  • 단위 테스트의 편의성을 높여준다.

 

* 의존성 : 한 객체가 다른 객체를 사용할 때 '의존성이 있다'고 한다. 

  ex) 멤버컨트롤러가 멤버서비스를 통해서 회원가입, 데이터조회를 해야한다.

          -> 컨트롤러가 멤버서비스를 의존한다. 

 

[참고]

https://mangkyu.tistory.com/150

 

 

+ 스프링 빈

   : Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)

* Spring IoC (IoC, Inversion Of Control, 제어의 역전)

   : 객체의 생성을 관리 위임 주체에게 맡김.

   : 사용자가 객체를 직접 사용하지 않고 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 된다. 

 

[참고]

http://melonicedlatte.com/2021/07/11/232800.html  

 

 

+ 스프링 빈과 의존 관계

일반적으로 (HelloSpring)Application이 들어있는 패키지의 하위패키지까지가 bin안에 들어간다.

(설정을 통해 타 패키지도 들어갈 수는 있음.)

 

- 컴포넌트 스캔과 자동 의존관계 설정

  : @Component (@Controller, @Service, @Repository) 애노테이션이 있으면 스프링 빈으로 자동 등록된다.

  : @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아 주입. 

 

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

 : 직접 스프링 빈에 등록할 클래스들을 별도로 파일(Config)을 만들어 저장하고 등록한 클래스위에 @Bean 애노테이션을 붙임.

 


** 싱글톤

  : 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴

  : 애플리케이션이 시작될 때 어떤 클래스가 딱 한번만 메모리를 할당하고  그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴

- 생성자가 여러번 호출되어도 실제로 생성되는 객체는 하나다. (자바 - private 사용)

 

- 메모리가 절약된다.


** DI의 방법

 

+ 필드 주입 (field Injection)

  : 변수 선언부에 @Autowired Annotation을 붙인다.

 

+ setter 주입 

 

+ 생성자 주입 *****

  : Constructor에 @Autowired Annotation을 붙여 의존성을 주입

 

 

-------코드 예제 넣기


[스프링 단어 잘 정리되어 있는 곳]

https://www.icia.co.kr/community/board/view/2/2/76? 

 

댓글