purplely88's home

시작에 앞서

3장을 완료해주세요.

 

데이터 베이스로부터 값 취득

다음으로는 데이터 베이스로부터 값을 취득해 보겠습니다.

이미지는 다음과 같습니다.

 

이미지

슬슬 그림에 한계가 오기 시작했다...

 

스프링에서는 그림과 같이 컨트롤러 클래스, 서비스 클래스, 리포지토리 클래스를 작성합니다. 

각 클래스의 역할은 다음과 같습니다.

 

리포지토리 클래스

데이터 베이스에 CRUD(Create Read Upload Delete) 조작을 하며, 그 결과를 반환합니다.

MVC 모델로 말하자면 Model에 해당합니다.

 

서비스 클래스

리포지토리 클래스와 같은 걸 사용하여 여러가지 서비스를 제공합니다.

MVC 모델로 말하자면 Model에 해당합니다.

 

컨트롤러 클래스

어떤 서비스를 사용할까를 지정하여, 서비스의 결과를 화면에 반환합니다.

MVC 모델로 말하자면 Controller에 해당합니다.

 

데이터 베이스

1장에서도 기술하였습니다만, 본 예제는 데이터 베이스를 따로 설치할 필요가 없이 사용할 수 있는 H2 데이터베이스를 이용합니다.

 

데이터 베이스의 설정과 같은 각종 설정은 기본적으로 application.properties 파일에 내용을 기재합니다.

H2 데이터 베이스를 이용하기 위해,  application.properties 파일에 다음과 같이 내용을 작성합니다.

 

application.properties

설정 내용은 H2 데이터 베이스에 접속할 때의 설정입니다.

8행과 9행에 있는 spring.datasource.schema=classpath:schema.sql spring.datasource.data=classpath:data.sql 는 데이터 베이스 접속할때의 설정이 아닌, SQL 실행에 관한 설정입니다.

 

스프링 부트를 재기동할 시에 classpath(src/main/resources/)에 있는 schema.sql, data.sql를 실행하는 의미입니다.

조금만 더 구체적으로 설명드리자면, schema.sql에서 테이블을 작성하고  data.sql에서 데이터를 등록하는 의미로 생각하시면 될 거 같습니다.

 

더욱이 H2 데이터 베이스는 메모리 상에 동작하는 In Memory 형식이기 때문에, 스프링 부트를 정지하면 테이블과 데이터가 없어집니다. 상기의 설정에는 스프링을 기동 할 때마다 schema.sql, data.sql 이 실행되기 때문에 스프링을 재기동하면 테이블/데이터의 초기화됩니다.

 

src/main/resources/schema.sql

src/main/resources/data.sql

이것으로 스프링 부트를 기동할때마다 테이블과 데이터가 작성됩니다.

다음으로는 리포지토리 클래스를 작성합니다. 

 

리포지토리

HelloRepository.java

포인트 1

컨트롤러 클래스에 @Controller 어노테이션을 붙인 것과 같이, 리포지토리 클래스에도 @Repository를 붙입니다.

어노테이션을 붙임으로 인해 DI에 등록되어집니다.

 

포인트 2

상기 프로젝트에는 스프링에서 가지고 있는 JDBC 접속용 클래스 JdbcTemplate를 사용하여, SELECT문을 실행합니다.

JdbcTemplate를 사용할 경우에는 @AutoWired 어노테이션을 붙입니다.

아직 이 시점에서는 @AutoWired를 붙임으로써 인스턴스를 생성해주는 걸로만 알고 계시면 될 거 같습니다.

(상세 설명은 추후에)

 

즉, 아래의 코드처럼 작성되었다고 생각하시면 됩니다.

private JdbcTemplate jdbcTemplate = new JdbcTemplate();

 

그러면 이제 검색 결과를 담는 employee 클래스를 작성합니다. 

 

Domain 클래스

Employee.java

 

포인트 1

@Data 어노테이션을 붙임으로써 getter/setter가 자동으로 완성됩니다. 

이건 이전에 설명한 Lombok 기능입니다.

 

부가설명 : domain 클래스

리포지토리 클래스나 서비스 클래스와 같은 사이에 전달하는 클래스를 스프링에서는 domain 클래스라 말합니다.

상기 Employee 클래스는 domain 클래스입니다. 

이외에도 model 클래스, DTO(Data Transfer Object)라고도 불립니다.

 

서비스 클래스

다음으로는 서비스 클래스를 작성합니다.

서비스 클래스에는 검색 결과를 Employee 클래스에 넣어 반환합니다.

 

HelloService.java

포인트 1

컨트롤러 클래스와 같이 서비스 클래스에도 @Service 어노테이션을 붙입니다.

또한, HelloRepository 클래스를 사용하기 위해 @Autowired 어노테이션을 붙입니다.

리포지토리 클래스에서 jdbcTemplate를 사용한 것처럼 현시점에서는 아래의 코드처럼 작성되었다고만 생각하시면 될 거 같습니다.

 

private HelloRepository helloRepository = new HelloRepository();

 

간단 설명

HelloRepository 클래스에는 jdbcTemplate의 queryForMap이라고 하는 메서드를 사용하여 검색을 실행하여, 그 검색 결과를 Map에 넣습니다.

Map의 Get 메서드에 테이블의 필드명을 지정하면, 값을 취득할 수 있습니다.

Map으로부터 취득한 값을 Employee 클래스의 인스턴스에 넣고 반환합니다.

 

다음은 hello.html부터 종업원 ID를 입력할 수 있도록 수정합니다.

 

HTML(기존)

hello.html

위 코드에서는 POST 송신처를 /hello/db라고 하는 Form 태그를 추가하였습니다.

 

다음은 컨트롤러 클래스에서 /hello/db 처리하는 메서드를 추가합니다.

 

컨트롤러 

HelloController.java

 

 

현재 문자열을 숫자로 변환하는 과정에서의 예외 발생시 처리는 제외했습니다.

앞에서와 같이 @RequestParam 어노테이션에 text2이라는 이름을 붙여, 파라미터를 받도록 합니다.

다음은 HelloService의 findOne 메서드에 상기의 값을 건네주면 그 검색 결과로 Employee 인스턴스가 반환됩니다.

 

Employee 클래스의 값을 model.addAttribute에 등록해두면 화면에서 받는 것이 가능합니다.

마지막으로 helloResponseDB.html을 작성합니다.

HTML(신규)

이것으로 DB로부터 값을 취득하는 코드를 작성하였습니다.

스프링 부트 애플리케이션을 기동하여 http://localhost:8080/hello에 접속해봅니다.

 

결과

마무리

스프링을 이용하여 간단하고 빠르게 웹 애플리케이션을 작성해 봤습니다.

다음 포스트부터는 조금 더 스프링을 심도 있게 다뤄보겠습니다.

'프로그래밍 > 스프링 부트' 카테고리의 다른 글

6. DI (2/4)  (0) 2020.06.16
5. DI (1/4)  (0) 2020.06.14
3. 웹 애플리케이션 작성 (파라미터 전달)  (0) 2020.06.14
2. 웹 애플리케이션 작성  (0) 2020.06.14
1. 시작  (1) 2020.06.14

시작에 앞서

2장을 완료해주세요.

 

파라미터 전달

다음으로는 화면에 값을 전달해보도록 하겠습니다.

코딩에 앞서 이미지는 다음과 같습니다.

 

이미지

POST 메서드가 추가되었네요!

 

먼저, 화면에 값을 전달하기 위하여, 이전에 작성한 hello.html을 수정합니다.

form 태그를 추가하여 값을 입력할 수 있도록 합니다.

포인트 1

th:value속성을 사용함으로써, 화면에서 컨트롤러 클래스에 값을 전달해주는 것이 가능합니다.

 

더불어, th: 가 붙은 속성은 타임 리프의 속성입니다. input 태그에는 value 속성이 이전부터 존재합니다.

그 속성에 th: 를 붙임으로써, 타임 리프의 속성임을 선언하게 됩니다.

 

간단 설명

form 태그의 경우, 통상 HTTP의 POST 메서드로 값을 전달합니다. (어느 메서드를 사용하는가는 form 태그의 method 속성에 지정합니다.)

 

HelloController.java

"helloResponse.html"에서  .html은 생략해도 됩니다.

포인트 1

@GetMapping과 같이 메서드에 @PostMapping 어노테이션을 붙입니다. 

이로 인해, POST 메서드로 송신됐을 경우 처리가 가능하게 됩니다.

 

포인트 2

메서드의 파라미터에 @RequestParam 어노테이션을 붙임으로 인해, 화면으로부터의 입력 내용을 받는 것이 가능합니다. 어노테이션의 파라미터는 html의 name속성의 값을 지정합니다.

 

즉, hello.html을 보자면..

<input type="text" name="text1" th:value="${text1_value}"/>

 

포인트 3

model.addAttribute에 키와 값을 설정합니다. 

이로 인해, 화면에서 지정한 키의 값을 받는 것이 가능합니다.

 

helloResponse.html

 

 

포인트 1

th:text 속성에 model.addAttribute로 등록한 키를 지정함에 있어, 컨트롤러 클래스로부터 값을 받는 것이 가능합니다.

아참. 키를 지정할 경우에는 ${<키 명>}을 입력합니다.

 

결과

이것으로 화면으로부터 값을 전달하는 웹 애플리케이션을 작성하였습니다.

해당 프로젝트를 스프링 부트 어플리케이션으로 기동하여 http://localhost:8080/hello로 접속해봅니다.

 

다음장은 데이터 베이스로부터 값을 취득해보겠습니다.

'프로그래밍 > 스프링 부트' 카테고리의 다른 글

6. DI (2/4)  (0) 2020.06.16
5. DI (1/4)  (0) 2020.06.14
4. 웹 애플리케이션 작성 (데이터 베이스로부터 값 취득)  (0) 2020.06.14
2. 웹 애플리케이션 작성  (0) 2020.06.14
1. 시작  (1) 2020.06.14

시작에 앞서

웹 애플리케이션 작성에 사용할 IDE는 STS이며 기초적인 설치 방법은 제외합니다.

getter/setter코드를 자동적으로 코딩해주도록 하기 위하여 Lombok을 설치해주세요.

 

프로젝트 생성

신규 스프링 부트 프로젝트
프로젝트 생성과 동시에 사용할 라이브러리

 

1. 스프링 부트 DevTools

스프링 부트 DevTools는 자동으로 웹 애플리케이션을 재기동해주는 개발 보충 툴입니다.

예를 들어, 웹 애플리케이션을 작성하고 실행하는 와중에 버그를 발견했을 시 보통 파일을 수정하여 보존 그리고 재기동을 해야 합니다만, 이 툴이 있으면 파일을 수정하여 저장하면 애플리케이션을 자동으로 재기동해줍니다.

 

2. Lombok

Lombok은 위에 시작에 앞서 부분에 간단히 설명한거와 같이 getter/setter 코드를 자동적으로 만들어줍니다.

 

3. 스프링 데이터 JDBC

※ 1장에서 설명

 

4. H2

H2데이터 베이스를 이용함으로써, 데이터 베이스 설치가 따로 필요 없어집니다. 

학습이나 테스트 환경의 데이터 베이스로써 사용되는 경우가 많습니다.

(여담으로 제가 실제 업무에서 사용한 것은 Postgre SQL입니다.)

 

5. Thymeleaf

타임리프는 스프링 부트 표준에서 사용되는 HTML 템플릿 엔진입니다. 

스프링이 보급하기전에는 JSP가 사용되어 왔습니다만, JSP는 HTML안에 자바 코드를 작성하기 때문에 HTML 가독성이 좋지 않습니다.

 

타임리프는 이 점을 개선해주기 때문에 HTML 가독성이 좋아집니다.

 

6. Spring Web

※ 1장에서 설명(MVC, 스프링 부트)

 

MVC 모델에 대하여

이제부터 웹 애플리케이션을 개발하기 위해 필수적인 지식이 있습니다.

바로 MVC 모델입니다.

 

MVC 모델을 간단히 설명하자면 다음과 같습니다.

 

Model

로직 처리를 담당합니다.

예를 들어, 데이터 베이스로부터 데이터 취득이나 여러 가지 계산을 처리

자바 클래스가 이 역할을 담당합니다.

 

View

화면 표시 역활을 담당합니다.

HTML이 이 역활을 담당합니다.

 

Controller

유저로부터의 요청(request)에 대해  Model 클래스에 처리를 의뢰합니다.

그리고 처리 결과에 대해 어느 View를 유저에 표시할 건지 정합니다.

 

자기 자신은 처리를 하지 않고, 처리 구간을 지휘하는 플레이메이커? 와 같은 역할을 담당합니다.

자바 클래스가 이 역활을 담당합니다.

 

이미지

웹 애플리케이션 처리 방식(마우스로만 그리기 어렵네요..)

1. 요청(request)

유저로부터 무언가의 요청을 서버에 송신합니다. 

예를 들어 유저 ID와 비밀번호를 입력하여 로그인 버튼을 누릅니다. 그러면 그 정보를 서버에 송신합니다. 

여기서 송신하는 곳. 즉 송신처가 Controller입니다.

 

2. 의뢰

요청을 받아 Model에게 처리를 의뢰합니다.

단, Model에게 의뢰하지 않는 경우도 있습니다.

 

3. 결과

Model은 처리 결과를 Controller에게 반환합니다. 결과를 받은 Controller는 어느 화면(View)을 유저에게 반환할 건지 정합니다.

 

4. 화면

유저가 보는 화면입니다. Model 처리결과를 표시하는 것도 가능합니다.

 

이와 같이 역할을 분단하게 하는 것이 MVC 모델입니다. 

그러면 왜 MVC 모델을 웹 애플리케이션에 작성하는 건가? 그건 바로 장점이 있기 때문입니다.

역할 분담을 해두면, 개별로 개발을 진행하는 것이 가능합니다. 게다가 재사용이나 확장도 쉽게 가능합니다.

역할을 분담하는 것은 자바와 웹 애플리케이션 개발만의 한해서의 얘기가 아닙니다.

 

Hello World 작성

그러면 이제부터 Hello World를 표시하는 웹 애플리케이션을 작성해보겠습니다.

 

이미지

Hello World 처리방식

HelloController 클래스에 HTTP의 GET 요청을 송신합니다.

HelloController 클래스로부터 hello.html을 반환합니다.

 

HTTP의 GET메서드란

HTML와 같은 것을 취득하기 위한 메서드입니다.

구글 크롬과 같은 브라우저에 URL을 입력하여 엔터키를 누르면, HTML 페이지가 표시됩니다.

브라우저에서 페이지를 취득할 때에는 GET메서드를 요청합니다.

 

패키지 구성

작성하는 건 아래와 같습니다.

com.example.demo.trySpring

HelloController.java

hello.html

 

SpringSampleApplication.java란

프로젝트 작성 시에 자동으로 작성되는 파일입니다.

보통 <프로젝트명> Application.java라는 이름으로 작성됩니다. 

이것이 스프링을 실행하는 프로그램입니다. 내용을 보면 main메서드가 있는 걸 확인하실 수 있습니다.

 

HelloController.java

포인트 1

스프링에서는 컨트롤러 클래스에 @Controller 어노테이션을 붙입니다.

@Controller 어노테이션을 붙임으로써, DI(의존성 주입)에 이용할 수 있게 됩니다.

 

포인트 2

@GetMapping 어노테이션을 메서드에 붙임으로써, HTTP 요청의 GET메서드를 처리할 수 있게 됩니다.

 

간단 설명

실제 위 작성 프로젝트는 localhost:8080/hello의 GET 요청에 대해 처리를 getHello메서드에서 이뤄지는 의미입니다.

 

또한, GET 요청의 경우, 메서드 이름을 맨 앞에 get을 붙이는 게 하나의 관습으로 되고 있습니다. 

(한국은 어떨지 모르겠네요..)

 

그리고 메서드의 반환 값에는 확장자 없이 html 파일명을 지정합니다.

 

hello.html

포인트 1

타임 리프를 사용하기 위하여, html 태그 안에 xmlns:th="http://www.thymeleaf.org"를 붙입니다.

실제 위 작성 프로젝트에서는 타임 리프 기능을 사용하지 않습니다.

 

실행

스프링 부트 애플리케이션 실행(일반 혹은 디버그 모드 상관없음)

http://localhost:8080/hello 접속

결과

hello.html이 표시됩니다.

'프로그래밍 > 스프링 부트' 카테고리의 다른 글

6. DI (2/4)  (0) 2020.06.16
5. DI (1/4)  (0) 2020.06.14
4. 웹 애플리케이션 작성 (데이터 베이스로부터 값 취득)  (0) 2020.06.14
3. 웹 애플리케이션 작성 (파라미터 전달)  (0) 2020.06.14
1. 시작  (1) 2020.06.14