본문 바로가기

스프링부트

Spring Boot 1~3장

교재: 코딩 자율학습 스프링 부트 3 자바 백엔드 개발 입문, 홍팍 저

 

1장 스프링 부트 시작하기

1.1 스프링 부트란

스프링 부트 : 자바 웹 프로그램을 더욱 쉽고 빠르게 만들기 위한 도구로 스프링 프레임워크를 개선한 것

개선 사항 -> 개발 환경 설정 간소화, 웹 애플리케이션 서버 내장

 

1.2 개발 환경 설정

JDK 설치 -> IDE 설치 -> 스프링 부트 프로젝트 만들기

JDK: 자바 코드의 번역과 실행 담당하는 자바 개발 도구 

IDE: 개발 생산성을 높여 주는 도구(이클립스 인텔리제이 등)

 

 

 

  • 스프링 부트 프로젝트 만들기

1. Spring Initializr 페이지에서 세부사항을 설정한다

Spring Boot 버전 접미사

-SNAPSHOT: 현재 테스트 단계

-Mx: 주요 기능 및 버그 수정 중인 단계

-RC: 전반적 기능과 버그 모두 수정된 최동 배포 전 단계

-GA: 최종 배포 단계

 

2. 오른쪽 화면의 Dependecies는 스프링 부트 프로젝트에 필요한 도구 가져오는 역할을 한다.

이번 프로젝트에 쓰인 도구는 다음 4가지이다.

-Spring Web: 웹 도구

-H2 Database: 자료 저장 DB

-Mustache: 화면 만드는 도구

-Spring Data JPA: DB 편리하게 다루는 도구

 

3. 하단 왼쪽의 [GENERATE] 버튼을 눌러 프로젝트를 내려받고 압축 해제한다.

 

4. 인텔리제이에서 해당 파일을 연다.

scr 디렉터리 -> main -> java(자바 코드 저장) & resources(외부 파일 저장)

FirstprojectApplication에서 메인 메서드 확인 가능

 

+)build.gradle 파일에서 버전 수정 후 옆의 코끼리 아이콘 클릭하면 스프링 부트 버전으로 변경된다.

 

  • 헬로 월드! 출력하기

1.메인 메서드를 실행한다. 

메서드 실행 후 콘솔 창 마지막 줄에 " Started FirstprojectApplication..."이 뜨면 서버 실행 완료된 것

"Tomcat started on port(s): 8080..."은 톰캣(웹 서버)이 8080이라는 포트에서 수행된것

 

2. 크롬 브라우저 주소 표시줄에 loclahost:8080 입력 후 이동 -> 스프링 부트 프로젝트가 실행된 서버에 접속

 

3. 크롬 브라우저 주소 표시줄에  localhost:8080/hello.html  입력 후 이동 (HTML 파일: hello.html)

 

4. 인텔리제이에서 src > main > resources > static 디렉터리(new-> HTML File)

8번 줄 4칸 들여쓰기로 입력

 

5. 크롬 브라우저 새로고침하면 실행 결과를 확인할 수 있다

 

1.3 웹 서비스의 동작 원리

클라이언트-서버 구조

클라이언트: 서비스 사용하는 프로그램 or 컴퓨터 (웹 브라우저)

서버: 서비스 제공하는 프로그램 or 컴퓨터 (스프링 부트)

웹 서비스는 서버 실행해야만 웹 브라우저 통해 접근 가능하다

 

localhost:8080/hello.html의 의미

localhost: 내 컴퓨터

8080: 포트번호(방 번호)

hello.html: 서버에 요청하는 파일

즉, 해당 주소로 접속 시 내 컴퓨터의 8080번에서 수행되는 서버에 heelo.html 파일을 요청한다

 

 


 

 

2장 MVC 패턴 이해와 실습

2.1 뷰 템플릿과 MVC 패턴

뷰 템플릿(View Template) or 뷰: 화면을 담당하는 기술로, 웹페이지 (View)를 하나의 틀(Template) 로 만들고 여기에 변수 삽입해 서로 다른 페이지는 보여준다

Mustache: 뷰 템플릿 만드는 도구

컨트롤러: 클라이언트의 요청에 따라 서버에서 이를 처리하는 역할

모델: 데이터 관리 역할

 

MVC 패턴(Model-View-Controller Pattern)

: 웹 페이지를 화면에 보여주고(View), 클라이언트의 요청을 받아 처리하고(Controller), 데이터를 관리하는(Model)역할을 나누는 기법

 

2.2 MVC 패턴을 활용해 뷰 템플릿 페이지 만들기

  • 뷰 템플릿 페이지 작성

1. 인텔리제이의 src > main > resources > templates 디렉터리에서 뷰 템플릿을 만든다

확장자 .mustache: 뷰 템플릿 만드는 도구, 즉 뷰 템플릿 엔진 의미

 

2. 머스테치 플러그인 설치

 Install Handlebars/Mustache plugin 클릭하여 설치

 

3. 파일의 제일 윗줄에 doc 입력 후 tab 키 누르면 기본 HTML 코드가 자동으로 작성됨, 표시될 문장 입력

 

  • 컨트롤러 만들고 실행

1. 인텔리제이의 src > main > java 디렉터리에 패키지를 만든다. 확장자는 .controller

2. 패키지 안에 자바 클래스를 만든다

3. 코드를 작성한다

@Controller: 컨트롤러 선언

@GetMapping: URL 요청 접수

 

+)실행 결과 한글 꺠짐 현상 빙지 위해 프로젝트에서 src > main > resources > application.properties 파일에 다음 코드 추가

server.servlet.encoding.force=true

 

4. 결과 확인

 

  • 모델 추가하기

1. 변수명을 사용하기 위해서 두 겹의 중괄호를 쓴다 -> {{변수명}}

2. 컨트롤러 메서드에서 매개변수를 받는다

3. 모델을 통해 변수를 등록한다 -> addAttribute() 메서드

4. 변수값은 입력하여 확인한다

 

<MVC 패턴 실습 요약>

뷰페이지 만들기
greetings.mustache

컨트롤러 만들기
FirstController.java

컨트롤러에서 뷰 페이지 반환하기
return "greetings";

뷰 페이지에 변수 삽입하기
{{username}}

컨트롤러에 모델 추가하기
niceToMeetYou(Model model)

모델에서 변수 등록하기
model.addAttribute("username", "희진");

 

2.3 MVC의 역할과 실행 흐름 이해하기

/hi 페이지의 실행흐름

 

/bye 페이지의 실행흐름

1. 컨트롤러는 @GetMapping 어노테이션을 통해 클라이언트의 요청을 받는다

2. templete 디렉터리에서 파일을 만든다

 

3. 변수(nickname) 이용하기 위해 컨트롤러 메서드(seeYouNext)에 변수를 등록한다

4. localhost:8080/bye에서 결과를 확인한다

 

2.4 뷰 템플릿 페이지에 레이아웃 적용하기

레이아웃(layout): 화면에 요소를 배치하는 일

헤더-푸터 레이아웃(header-footer layout): 가장 기본이 되는 레이아웃

 

  • /hi 페이지에 헤더-푸터 레이아웃 적용하기

부트스트랩: 웹 페이지 쉽게 만들 수 있게 작성해 놓은 코드 모음으로, 각종 레이아웃, 버튼 등 디자인을 미리 구현해 놓은 것

1. 부트스트랩 홈페이지에서 Starter template 코드를 가져와 greetings,mustache 파일에 가져온다

2. 주석을 작성하여 레이아웃을 구분한다

3. 헤더영역에 네비게이션 바 추가하기

부트스트랩 홈페이지에서 'navbar' 검색한 후 코드 복사 -> 네비게이션 주석아래 붙여넣기

4. 푸터 영역에 사이트 정보 추가하기

다음 코드를 작성하고, 망치아이콘 or 단축키(ctrl+F9) 눌러 프로젝트를 빌드한다

5. 코드의 콘텐트 부분에 class 속성을 추가한다 (p-5: 상하좌우 여백 5배)

 

  • /bye 페이지에 헤더-푸터 레이아웃 적용하기

템플릿화한다 = 코드를 하나의 틀로 만들어 변수화한다 -> {{>header}}, {{>footer}}

1. 템플릿 파일을 생성한다. (footer와 heaer)

2. heaer와 footer 파일에 greetings파일의 헤더와 푸터 영역을 각각 잘라내어 붙여넣는다

3. greetings 파일의 잘라낸 부분엔 각각 {{>파일명}}을 작성한다

 

4. goodbye 파일에도 똑같이 적용한다

 

 


 

 

3장 게시판 만들고 새 글 작성하기: Create

3.1 폼 데이터

폼 데이터(form data): HTML 요소인 <form>태그에 실려 전송되는 데이터

<form>태그: 데이터 어디로 어떻게 보낼지 등 적어서 보냄

DTO(Data Transger Object): <form>태그가 보낸 데이터는 받는 서버의 컨트롤러의 객체, DTO가 받은 데이터는 DB에 저장

 

3.2 폼 데이터를 DTO로 받기

  • 입력 폼 만들기

src> main > resources > templates > articles 디렉터리 > new.mustache

<input>태그: 게시판 제목 입력

<textarea>태그: 내용 입력

<button>태그: 전송버튼, 버튼 속성 표기

  • 컨트롤러 만들기

src> main > java > one.example.firstproject > controller 패키지 > ArticleController.java

부트스트랩 CSS 코드 적용(디자인)

  • 폼 데이터 전송하기

<form>태그에 입력할 때 필요한 2가지 정보(데이터를 어디로, 어떻게 보낼지에 관한  정보)를 추가한다

-action 속성: 어디로 보낼지, URL 연결 주소 적어 폼 데이터 보낼 페이지 명시

-method 속성: 어떻게 보낼지, get과 post로 2가지 설정 가능

  • 폼 데이터 받기

1. 컨트롤러에 createArticle() 메서드 추가

2. @PostMapping() 사용하여 URL 요청 받기

 

  • DTO 만들기

DTO(Data Transfer Object): 컨트롤러에서 폼 데이터 받기

1. DTO 파일 만들기

src > main > java > one.example.firstproject > dto패키지 > ArticleForm.java 파일 = DTO

 

2. 제목과 내용 받을 필드 만들고,생성자 추가하기

생성자는 content 필드에 마우스 오른쪽 버튼 [Generate] -> [Constructor] 누르고 ctrl누른채 선택

 

3. 폼 데이터 잘받았는지 확인할 toString() 메서드 추가

ArticleForm() 메서드 아래 행 마우스 오른쪽 버튼 [Generate] -> [toString()]

 

  • 폼 데이터를 DTO에 담기

AricleController에서 코드 수정

 

  • 입력 폼과 DTO 필드 연결하기

1. DTO에 선언한 필드에 값 들어가려면 new.mustache 입력 폼에 필드명 지정해야 한다

name="title"

 

name="content"

2. 브라우저에 제목과 내용 입력하면, 인텔리제이 실행창에 데이터가 출력된다

<폼 메디어를 DTO로 받아오기 요약>
1. 뷰 페이지(new.mustache) 만들고 <form> 태그의 action 속성으로 데이터 어디 보낼지(action="/articles/create"), method 속성으로 데이터를 어떻게 보낼지 (method="post") 정의한다

2. 컨트롤러(ArticleController.java) 만들고 PostMapping 방식으로 URL 주소를 연결(@PostMapping("/articles/create")한다

3. 전송받은 데이터를 담아 둘 객체인 DTO(ArticleForm.java)를 만든다

4. 컨트롤러에서 폼 데이터를 전송받아 DTO에 담는다

 

3.3 DTO를 데이터 베이스에 저장하기

DTO를 엔티티로 변환하기 -> 리파지터리를 이용해 엔티티를 DB에 저장하기

DB 프로그램으로 H2 DB를 사용한다

 

  • JPA(Java Persistence API): 자바 언어로 DB에 명령을 내리는 도구

JPA의 핵심 도구

-엔티티: 자바 객체를 DB가 이해할 수 있게 만든것, 이를 기반으로 테이블 만들어짐

-리파지터리: 엔티티가 DB 속 테이블에 저장 및 관리될 수 있게 하는 인터페이스

 

  • DTO를 엔티티로 변환하기

1. Article 클래스 만들기

src > main > java > com.example.firstproject > controller패키지 > ArticleController = Article.java

01) 어노테이션 작성

@Entity: 이 클래스 기반으로 DB에 테이블 생성

@Column: 필드를 DB에서 인식하게 도와줌, 테이블과  각 열 연결

@Id: 대푯값을 Id로 선언

@GenerateValue: 대푯값 자동으로 생성

 

02) 생성자와 toString() 메서드 추가

content필드에서 마우스 오른쪽 버튼 {Generate] -> [Constructor], ctrl 누른채 모두 선택 후 [OK]

content필드에서 마우스 오른쪽 버튼 {Generate] -> [toString()], ctrl 누른채 모두 선택 후 [OK]

Article.java

03) toEntity() 메서드 추가하기

ArticleController의 toEntity() 코드에 마우스 올려두면 " Create method 'toEntity' in 'ArticleForm'이 뜬다

ArticleForm에 toEntity() 메서드가 추가된다

Article.java에서 생성자 id, title, content를 매개별수로 받으므로 ArticleForm 객체에 엔티티로 반환한다

AriticleForm.java

 

  • 리파지터리로 엔티티를 DB에 저장하기

ArticleController.java

23번 줄: article 엔티티를 저장해 saved 객체에 반환

11번 줄: articleRepository 객체 선언

 

1. 리파지터리 만들기

src > main > java > com.example.firstproject > repository패키지 > ArticleRepository.java (인터페이스 선택)

 

Article: 관리 대상 엔티티의 클래스 타입(여기선, Ariticle)

Long: 관리 대상 엔티티의 대푯값 타입 (여기선, id의 타입)

CrudRepository에서 상속 받아 기능 사용 가능(DB에서 생성, 읽기, 수정, 삭제하는 기본 동작)

ArticleController에 자동 임포트

 

  • 객체 주입하기(의존성주입)
@Autowired //스프링 부트가 미리 생성해 놓은 객체 연결

 

  • 데이터 저장 확인하기

ArticleController.java

System.out.println(article.toString()); //1.DTO가 엔티티로 잘 변환되는지 확인 출력
System.out.println(saved.toString()); //2.article이 DB에 잘 저장되는지 확인 출력

http://localhost:8080/articles/create
인텔리제이의 Run탭 확인

 

3.4 DB 데이터 조회하기

  • H2 DB 접속하기

1. application.properties 파일에 밑의 코드 작성

H2 DB에 웹 콘솔로 접근할 수 있도록 허용하는 설정

spring.h2.console.enabled=true

 

2. localhost:8080/h2-console에 접근

localhost:8080/h2-console

JDBC URL에 적힌 값: DB 접근 주소

 

3. 인텔리제이의 [Run] 탭에서 jdbc검색(ctrl+f) 후 붙여넣은 후 [Connect] 클릭 -> DB 접속

 

  • 데이터 조회하기

1. ARTICLE 테이블 클릭 -> SQL문 나옴 -> [Run] 클릭

테이블 행 단위로 저장, 행=레코드(record)

 

2. 웹 브라우저(localhost:8080/articles/new)에 내용 2번 전송 후 [Run] 탭 확인

 

3. ARTICLE 테이블에 새로운 행 삽입

INSERT INTO article(id, title, content) VALUES(3, 'cccc', '3333');

 

4.테이블 확인