# 참고 강의
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 : 김영한님
# 공부한 코드를 올린 github
https://github.com/anso33/SpringStudy_first.git
# 1주차 정리 내용
01. 프로젝트 환경설정
+ 일반적으로 처음 프로젝트를 생성할 때 스프링부트 스타터를 이용한다. 보다 쉽게 build.gradle 파일을 완성할 수 있다.
- 스프링부트 스타터 : https://start.spring.io
** 자바 여러버전 관리하는 법
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: 스프링 통합 테스트 지원
+ 스프링 부트가 제공하는 기능을 알고 싶을 때
+ thymeleaf 템플릿엔진
: 서버사이드 자바 템플릿 엔진의 한 종류
: Servlet Code로 변환되지 않아 비즈니스 로직과 분리되어 View에 집중할 수 있다.
- Servlet 컨테이너의 개입없이 독자적으로 View를 완성할 수 있다.
** 템플릿 엔진
: 지정된 템플릿 양식과 데이터가 합쳐져 HTML문서를 출력하는 소프트웨어
: 웹사이트 화면의 형태를 만드는 것을 도와주는 양식
+ 서버 템플릿 엔진
: 서버에서 가져온 데이터를 미리 정의된 템플릿에 넣어(java코드로 문자열을 만든 후)
html으로 변환하여 클라이언트(브라우저)에 전달
ex)
+ 클라이언트 템플릿 엔진
: 클라이언트(브라우저) 위에서 작동, 서버에서는 JSON, XML형식의 데이터만 전달.
ex)
[참고사이트]
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://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?
'Spring | SpringBoot' 카테고리의 다른 글
[스프링 스터디] 6주차 - 스프링 핵심 원리.기본편 (0) | 2022.02.17 |
---|---|
[스프링 스터디] 5주차 - 스프링 핵심 원리.기본편 (0) | 2022.02.10 |
[스프링 스터디] 4주차 - 스프링 핵심 원리.기본편 (0) | 2022.01.30 |
[스프링 스터디] 3주차 - 스프링 핵심 원리.기본편 (0) | 2022.01.25 |
[스프링 스터디] 2주차 - 스프링 입문 (0) | 2022.01.20 |
댓글