본문 바로가기
JAVA

[Java] 스프링 입문 - 코딩을 하며 스프링 공부해보기(SpringBoot, 웹 MVC, DB 접근 기술)

by five-sun 2023. 1. 7.
728x90

강의 출처 : https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49603

 

학습 페이지

 

www.inflearn.com

 

-간단한 웹 어플리케이션 개발

  • 스프링 프로젝트 생성
  • 스프링 부트로 웹 서버 실행
  • 회원 도메인 개발
  • 웹 MVC 개발
  • DB 연동 - JDBC -> JPA -> SprngDataJPA
  • 테스트 케이스 작성

-프로젝트 사용기술

  • Spring Boot
  • JPA
  • Gradle
  • Hibernate
  • Tymeleaf

 

Spring으로 웹을 만드는 사이클을 핵심적으로 다뤄보는 시간을 가져본다.

스프링 학습의 제대로 된 길잡이의 역할. 실무에서 사용되는 기술 중심으로 진행된다.

 

스프링 부트 스타터 사이트를 이용해서 빠르게  프로젝트를 생성해본다.

웹을 만들 것이기에 Spring Web과 Html 변환을 위한 템플릿 엔진 Thymeleaf를 의존성해 추가한 후 만들어 준다.

 

기본적으로 만들어주는 src 폴더에는 main 과 test 폴더가 존재한다.

main에는 java 소스코드를 담아주는 java 폴더와 이외에 Html, Css, Javascript 등과 관련된 소스코드를 넣을 resource 폴더로 나뉜다.

test 폴더에는 test를 위한 기본적이 소스코드를 제공해준다.

 

Build를 진행하고 public static void main을 run해주면 내장된 tomcat을 통해서 8080포트에서 실행된다.

스프링 부트의 핵심 라이브러리 : spring-boot-starter-web, spring-boot-starter-thymeleaf, spring-boot-starter(공통) : 스프링 부트, 스프링 코어, 로깅 등이 있다.

테스트 라이브러리로 junit 테스트 프레임워크를 사용하고 mockito나 assertj, sprint-test 등을 추가로 사용한다.

 

스프링 부트에선 resource/static/index.htm를 생성해서 웰컴페이지로 사용할 수 있다.

스프링 부트는 스프링에서 사용되는 엄청 많은 기능들을 제공하므로 모든 기능을 공부하기 보단 사용하고자 하는 기능을 적절하게 찾아서 사용하는 법을 공부하는 것이 중요하다고 한다.

 

IDE를 이용하지 않고 터미널환경을 통해서도 프로젝트 폴더에 접근한 후, ./gradlew build 를 통해서 jar파일을 만들고 jar파일을 풀어서 스프링을 실행시킬 수 있었다.

 

index.html과 hello.html을 만들고 helloController를 만들어서 GetMapping이 들어올 경우, 동작할 수 있도록 설정해보았다.

index.html

정적인 페이지 index.html 과 model을 통해서 data를 화면에 출력하는 동적인 템플릿 페이지 hello.html을 만들어보았다.

hello.html

 

스프링 웹 개발을 본격적으로 들어가보면서 정적 컨텐츠부터 간단하게 다뤄보았다.

정적 컨텐츠는 데이터를 받아올 필요가 없는 html 파일 그 자체를 화면에 띄우면 되는 컨텐츠를 의미한다.

Spring에 해당 Controller에서 경로를 찾을 수 없을 때, static 폴더에서 파일을 찾아 화면에 띄워준다.

 

MVC는 Model, View, Controller를 의미한다.

과거에는 뷰와 컨트롤러가 분리되어 있지 않았다. 이 방식을 Model 1 방식이라고 한다. 

MVC 구조는 브라우저에서 요청이 내장 톰캣 서버를 통해 컨트롤러에 전달이 되고 맞는 파일을 찾아 템플릿 엔진에 처리를 넘기고 변환된 HTML를 웹브라우저에 돌려준는 방식이라고 이해하고 넘어갔다.

@ResponseBody 를 사용하면 HTTP 바디 부분에 문자 내용을 직접 반환해주면서 뷰 리졸버를 사용하지 않게 된다고 한다.

 

간단한 비즈니스 로직을 만들어서 스프링을 활용해 백엔드 개발을 해보았다.

 

비즈니스 요구사항 정리

데이터: 회원 ID, 이름

기능: 회원 등록, 조회

데이터 저장소가 아직 선정되지 않았다는 가상의 시나리오

 

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

서비스: 핵심 비즈니스 로직 구현

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

도메인: 비즈니스 도메인 객체

 

회원 도메인과 리포지토리 만들어보기

도메인 패키지를 생성하고 회원 도메인을 만든다 (Getter and Setter 사용)

데이터 저장소가 아직 선정되지 않았기 때문에 리포지토리 인터페이스를 만들고 인터페이스를 상속받아 회원 리포지토리를 작성했다.

 

회원레포지토리 테스트 케이스 작성

메모리멤버리포지토리를 개발한 후, 테스트 케이스를 작성해보았다.

반대로 테스트를 먼저 만들고 구현 클래스를 구현하는 방법을 TDD라고 한다.

 

회원 서비스 개발

회원가입 - join()

전체 조회 - findMembers()

회원 조회 - findOne() 을 구현하였다.

 

회원 서비스 테스트

Shift+Ctrl+T를 사용해서 쉽게 테스트 껍데기를 만들 수 있다.

테스트 케이스를 작성할 때는 given, when, then을 생각하면서 작성하는 게 좋다고 한다. 

 

스프링은 @Component를 찾아서 Bean을 만들고 @Autowired를 통해서 서로를 연결해주는 구조를 갖는다.

컴포넌트 스캔방식을 사용하는 것이 편리해보이지만 자바 코드로 직접 스프링 빈 등록하는 방법도 알아두어야 한다고 한다.

@Configuration
	public class SpringConfig {
	
    @Bean
 	public MemberService memberService() {
 	return new MemberService(memberRepository());
 	}
}

다음과 같은 방식으로 빈을 직접 등록해준다.

이전에 XML로  설정하는 방식도 있었지만 잘 사용하지 않고 있다고 한다.

 

필드주입, setter 주입, 생성자 주입 방식이 있지만 생성자 주입 방식을 권장한다고 한다.

 

 

회원 관리 웹 기능 만들기

Controller에서 요청이 들어올 경우 필요한 뷰를 렌더링할 수 있도록 작업하고 요청에 따라 필요한 동작들이 진행될 수 있도록 코드를 작성해보았다. 화면단을 만들면서 Thymeleaf 템플릿 엔진을 사용해서 화면에 데이터를 추가해서 출력하는 법도 공부할 수 있었다.

 

H2 데이터베이스 사용

개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공을 하는 장점이 있었다.

 

H2데이터베이스를 사용하면서 순수 Jdbc, 스프링 JdvcTemplate, JPA, 스프링 데이터 JPA와 같은 스프링 DB 접근 기술을 공부해보도록 하자. 사용을 위해서 build.gradle파일에 관련된 라이브러리를 추가하면서 진행하였다.

 

먼저, 고대의 방식 Jdbc..!

이 방식은 잘 사용되지 않는 방식이기에 한번만 공부하고 넘어간다는 느낌으로 학습하였다.

DI를 변경해서 H2 데이터베이스를 사용하는 Jdbc 방식으로 레포지토리를 변경해서 실행하고 결과를 확인해보았다.

결과 확인 후, 항상 테스트를 해보는 습관을 들이자!

테스트케이스에 @Transactional을 사용하면 테스트에 데이터를 사용한 후 Rollback을 해주므로 매우 편리하다!!

 

또한 여기서 DataSource를 사용하게 되는데,,,

DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체다. 스프링 부트는 데이터베이스 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어둔다. 그래서 DI를 받을 수 있다.

 

스프링 Jdbc템플릿은 MyBatis 같은 라이브러리로 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야 한다.

Jdbc템플릿의 경우, 실무에서 사용되고 있다고 한다.

 

JPA의 경우, 기존의 반복 코드는 물론이고 기본적인 SQL도 JPA가 직접 만들어서 실행해주는 장점이 있다. 이를 통해 SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있고 개발 생산성도 높일 수 있다.

JPA는 정말 중요한 기술이다. 스프링을 공부하는 만큼 JPA도 공부해야 한다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 를 추가하여 관련 라이브러리를 추가할 수 있다.

 

JPA를 실습해보았다.

JPA를 사용하기 위해선 build.gradle에 추가해준다.

show-sql : JPA가 생성하는 SQL을 출력한다.

ddl-auto : JPA는 테이블을 자동으로 생성하는 기능을 제공하는데 none 를 사용하면 해당 기능을 끈다.

JPA를 사용하기 위해선 @Entity와 PK를 등록해주어야 한다.

PK가 아이디 넘버와 같이 DB가 알아서 생성해주는 경우 Identity 전략을 사용한다는 것을 명시해주어야 한다.

JPA는 EntityManager라는 것으로 모든 것을 동작한다. data-jpa 라이브러리를 받은 경우, 스프링에서 EntityManager를 자동으로 생성해주고 우리는 그것을 사용하면 되는 것이다.

JPA는 PK를 기반으로 동작하는 경우, 더욱 간편하게 사용할 수 있고 아닌 경우 createQuery를 사용해서 qlString을 작성해주면 된다.

JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.

 

대망의 스프링 데이터 JPA!!!

스프링 부트와 JPA만 사용해도 개발 생산성이 많으 증가히고, 개발해야할 코드가 확연히 줄어든다.

여기서 스프링 데이터 JPA를 사용하면 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있다!

반복 개발해온 기본 CRUD 기능을 스프링 데이터 JPA가 모두 제공한다.

따라서 개발자는 핵심 비즈니스 로직을 개발하는데 집중할 수 있다!

실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수 입니다.

 

스프링 데이터 JPA는 인터페이스를 통한 기본적인 CRUD와 메서드 이름만으로 조회 기능, 페이징 기능 등을 제공한다.

이외에 필요한 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용할 수도 있다.

 

*JPA와 스프링 데이터 JPA는 추가적으로 계속 공부해나가야할 영역인 거 같다.

 

AOP(Aspect Oriented Programming)는 관전 지향 프로그래밍으로 스프링의 특징 중 하나라고 알고 있다.

공통 관심 사항과 핵심 관리 사항을 분리해서 원하는 곳에 공통 관심 사항을 적용하는 것이 AOP 적용이다.

 

AOP를 적용하는 순간 프록시 객체를 생성해서 사용하는 방식을 사용하게 된다.

 

스플링으로 웹 어플리케이션을 개발하는 방법을 얇고 넓게 학습해보았다. 이것을 기반으로 스프링을 더욱 세세하게 공부하고 실무에서 발생하는 문제들을 해결할 수 있는 능력을 키워나가야 겠다.

 

 

728x90