학기 중에 프론트엔드 화면 구성을 진행하면서 서버와의 통신, 데이터 관리 등에 대해서 더 알아가고 싶은
의문점들이 많았다. 아무래도 프론트 개발보다 백엔드 개발은 생소하다 보니 이번 방학을 통해 주로 사용하는
스프링에 대해서 공부하려고 한다.
- intellij 사용
- 본 강의에서는 IDE로 인텔리제이를 사용한다.
- Gradle 통해서 실행하는 것보다 intellij로 자바를 직접 실행하는 것이 더 빠르다.
- Gradle 이란?
- gradle은 의존 관계가 있는 라이브러리들을 함께 끌어오는 것으로 생각하면 된다.
- 프론트 개발 시에 yarn이나 npm으로 여러 라이브러리들을 다운 받았었는데
그런 개념으로 생각했다. - 본 강의에서는 타임리프 템플릿 엔진 / 톰캣(웹서버) / junit 테스트 라이브러리를
주로 사용한다.
- 프론트 개발 시에 yarn이나 npm으로 여러 라이브러리들을 다운 받았었는데
- gradle은 의존 관계가 있는 라이브러리들을 함께 끌어오는 것으로 생각하면 된다.
<동작 환경>
웹 브라우저 -> 내장 톰캣 서버 -> 컨트롤러 -> 뷰 리졸버 -> 웹 브라우저 이런 식으로 흘러간다.

위 그림은 MVC를 직접 그리면서 이해해본 결과물이다.
- API
- 여기서 API를 사용하면 뷰 리졸버 대신 데이터를 직접 반환한다.
- JSON 이라는 형식에 맞추어서 데이터를 전달한다.
- @ResponseBody를 사용
- 패키지 구성
- 컨트롤러: 웹 MVC의 컨트롤러
- 서비스: 비즈니스 로직
- 레포지토리: DB접근
- 도메인: 객체
- junit 테스트
- GUI 프로그래밍 했을 때 사용했던 방법과 유사하다.
- 다만 @AfterEach를 사용해서 테스트 종료 시에 데이터를 삭제하여
각 테스트의 독립성을 유지한다. - @BeforeEach 각 테스트 실행 전에 호출하여 항상 새로운 객체를 생성한다. => 의존 관계도 다시 맺음
@AfterEach //이걸 사용해야 1번 테스트 후에 2번 테스트를 진행해도 오류가 안 뜬다.
public void afterEach() {
repository.clearStore();
}
@Test
public void save() {
//given
Member member = new Member();
member.setName("spring");
//when
repository.save(member);
//then
Member result = repository.findById(member.getId()).get();
assertThat(result).isEqualTo(member);
}
@Test
public void findByName() {
//given
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
//when
Member result = repository.findByName("spring1").get();
//then
assertThat(result).isEqualTo(member1);
}
TDD => 테스트 주도 개발 : 테스트 코드에 맞춰서 개발을 진행한다.
<DI => 의존성을 내가 직접 넣어준다. 의존성 주입 dependency injection>
-> @Autowired를 사용하면 스프링이 연관된 객체를 컨테이너에서 찾아서 넣어준다. (스프링이 주입해줌)
- 스프링 빈으로 등록하는 2가지 방법
- 컴포넌트 스캔
- @으로 실행 / 컴포넌트를 스프링 컨테이너에 등록 후 연결
- 해당 패키지와 하위 패키지에서만 컴포넌트 스캔을 실행한다.
- 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다
(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. - @Controller / @Service / @Repository
- 자바 코드로 직접 스프링 빈 등록
- 파일을 하나 만들어서 @Configuration을 사용하여 직접 등록한다.
- @Bean으로 등록
- 컴포넌트 스캔
=> 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔 사용
상황에 따라 클래스를 변경해야 한다면 스프링 빈으로 직접 등록
/ @Autowired는 스프링이 관리하는 객체에서만 동작하고 내가 직접 생성한 객체에서는 동작하지 않는다.
DI:
필드 주입: 그냥 별로 안좋음
세터 주입: 아무나 메소드를 사용하게 되어서 수정 가능성이 크다.
생성자 주입: 제일 권장하는 방식
참고: 컨트롤러가 정적 파일보다 우선순위가 높다.
- @PostMapping
html form에서 method가 post이면 post방식으로 넘어가서
컨트롤러에서 @PostMapping과 매칭된다.
post는 보통 어떤 형식에 넣어서 데이터를 전달해서 등록할 때 post를 쓴다.
get은 어떤 정보를 조회할 때 사용한다.
다음엔 DB연결과 실습을 진행할 예정이다.