이전 게시글 가장 마지막에 간략하게 소개했는데, 자세한 설명이 필요할 것 같아 새로운 포스트를 작성하게 되었다.

질문 답변 게시판을 만든다고 가정해보다. 질문이나 답변을 작성하면 데이터가 생성된다. 그러므로 데이터를 저장하거나 조회하거나 수정하는 등의 기능을 구현해야 한다. 웹 서비스는 데이터를 처리할 때 대부분 데이터베이스를 사용한다.

그런데 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이 필요하다. 이때 ORM(object relational mapping)을 이용하면 자바 문법만으로도 데이터베이스를 다룰 수 있다. 즉, ORM을 이용하면 개발자가 쿼리를 직접 작성하지 않아도 데이터베이스의 데이터를 처리할 수 있다.

 

출처: 점프 투 스프링부트

 

코드에서 Question은 자바 클래스이며, 이처럼 데이터를 관리하는 데 사용하는 ORM 클래스엔티티(Entity)라고 한다. ORM을 사용하면 내부에서 SQL 쿼리를 자동으로 생성해 주므로 직접 작성하지 않아도 된다. 즉, 자바만 알아도 데이터베이스에 질의할 수 있다. 이 외에,  ORM을 이용하면 데이터베이스 종류에 상관 없이 일관된 코드를 유지할 수 있어서 프로그램을 유지·보수하기가 편리하며, 내부에서 안전한 SQL 쿼리를 자동으로 생성해 주므로 개발자가 달라도 통일된 쿼리를 작성할 수 있고 오류 발생률도 줄일 수 있다는 장점이 있다.

 

이것을 스프링부트에서는 JPA(Java Persistence API)를 사용하여 데이터베이스를 처리한다. JPA는 자바 진영에서 ORM(Object-Relational Mapping)의 기술 표준으로 사용하는 인터페이스의 모음이다. 다음 포스팅에서 본격적으로 JPA에 대해 알아보자.

 

'백엔드 > Springboot' 카테고리의 다른 글

엔티티(Entity) -1-  (0) 2023.09.17
JPA 환경설정  (0) 2023.09.17
JPA  (1) 2023.09.17
컨트롤러  (0) 2023.09.17
스프링부트 프로젝트의 구조  (0) 2023.09.16

※본 게시글은 점프 투 스프링부트 교재를 기반으로 작성되었음.

 

로컬서버를 구동하고, localhost:8080/hello 페이지를 요청했을 때,

이렇게 나오는 경우가 있다. 이 오류의 원인은 스프링부트 서버가 http://localhost:8080/hello 라는 요청을 해석할 수 없기 때문이다. 이 오류를 해결하기 위해서는, 컨트롤러를 작성하고 hello/ URL에 대한 매핑을 추가하면 된다. 페이지 요청이 발생하면 스프링부트는 가장 먼저 컨트롤러에 요청된 페이지의 URL 매핑이 있는지를 조사한다.

위와 같이, HelloController 클래스에 @Controller 애너테이션을 적용하면 HelloController 클래스는 스프링부트의 컨트롤러가 된다. 그리고 메서드의 @GetMapping 애너테이션은 요청된 URL과의 매핑을 담당한다. 서버에 요청이 발생하면 스프링부트는 요청 페이지와 매핑되는 메서드를 컨트롤러를 대상으로 찾는다. 즉, 스프링부트는 http://localhost:8080/hello 요청이 발생하면 /hello URL과 매핑되는 index 메서드를 HelloController 클래스에서 찾아 실행한다.

@GetMapping http://localhost:8080 과 같은 도메인명과 포트는 적지 않는다. 왜냐하면 도메인명과 포트는 서버 설정에 따라 변하기 때문이다. /~~ 부분만 적으면 된다.

 

GetMapping을 적용해도 위 노란색 표시가 되어 있는 코드가 입력되지 않으면 404가 아닌 500으로 새로운 오류가 나타나게 된다. URL과 매핑된 함수는 결괏값을 리턴해야 하는데 아무런 값도 리턴하지 않기 때문에 오류가 발생한 것이다. 오류를 해결하려면 클라이언트(브라우저)로 응답을 리턴해야 한다. 그 역할을 하는 것이 @ResponseBody 애너테이션이다.

@ResponseBody 애너테이션은 URL 요청에 대한 응답으로 문자열을 리턴하라는 의미이다.

필자는 이런식으로 코드를 작성하였고, 로컬 서버 구동 후 페이지를 다시 호출하면.

 

위와 같이 올바르게 출력된 것을 확인할 수 있다!

 

요약을 해 보면,

@Controller -> JSP, HTML과 같은 View를 전달할 때 주로 쓰임 

@RestController = @ResponseBody + @Controller -> Data를 전송할 때 (JSON형식으로 프론트에게 API 제공)

 

추가적으로, 매핑의 종류에는 다음과 같은 것들이 있다.

@RequestMapping(value = ”url”, method = RequestMethod.GET)

@GetMapping(“url”)

@PostMapping

@DeleteMapping

@PutMapping

매핑을 도식화한 그림이다. 참고가 되었으면 한다.

'백엔드 > Springboot' 카테고리의 다른 글

엔티티(Entity) -1-  (0) 2023.09.17
JPA 환경설정  (0) 2023.09.17
JPA  (1) 2023.09.17
ORM(Object Relational Mapping)  (0) 2023.09.17
스프링부트 프로젝트의 구조  (0) 2023.09.16

※본 게시글은 '점프 투 스프링부트' 교재를 참고함.

src/main/java 디렉터리

src/main/java 디렉터리의 com.gdsc.webboard 패키지는 자바 파일을 작성하는 공간. 처음 접했을 때 이 디렉터리를 찾지 못해 잠깐 해멨었다. 스프링부트의 컨트롤러, 폼, DTO, 데이터베이스 처리를 위한 엔티티, 서비스 파일 등 핵심 코드를 작성하는 디렉터리니 반드시 꼭 알아둘 것.

WebBoardApplication 파일

스프링부트 애플리케이션의 시작을 담담하는 파일이다.

WebBoardApplication 클래스에는 위와 같이 반드시 @SpringBootApplication 애너테이션이 적용되어 있어야 한다. @SpringBootApplication 애너테이션을 통해 스프링부트의 모든 설정이 관리된다.

 

src/main/resources 디렉터리

src/main/resources 디렉터리는 자바 파일을 제외한 HTML, CSS, Javascript, 환경파일 등을 작성하는 공간이다.

templates 디렉터리

src/main/resources 디렉터리의 하위 디렉터리인 templates 디렉터리에는 템플릿 파일을 저장한다. 템플릿 파일은 HTML 파일 형태로 자바 객체와 연동되는 파일이다. templates 디렉터리에는 SBB의 질문 목록, 질문 상세 등의 HTML 파일을 저장한다.

static 디렉터리

static 디렉터리는 SBB 프로젝트의 스타일시트(.css), 자바스크립트(.js) 그리고 이미지 파일(.jpg, .png) 등을 저장하는 공간이다.

application.properties 파일

application.properties 파일은 SBB 프로젝트의 환경을 설정한다. SBB 프로젝트의 환경, 데이터베이스 등의 설정을 이 파일에 저장한다.

src/test/java 디렉터리

src/test/java 디렉터리는 SBB 프로젝트에서 작성한 파일을 테스트하기 위한 테스트 코드를 작성하는 공간이다. JUnit과 스프링부트의 테스팅 도구를 사용하여 서버를 실행하지 않은 상태에서 src/main/java 디렉터리에 작성한 코드를 테스트할 수 있다.

build.gradle 파일

그레이들(Gradle)이 사용하는 환경 파일이다. 그레이들은 그루비(Groovy)를 기반으로 한 빌드 도구로 Ant, Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 빌드 도구이다. build.gradle 파일에는 프로젝트를 위해 필요한 플러그인과 라이브러리 등을 기술한다.

 

스프링부트의 개략적인 구조는 이러하다. 클라이언트-서버 간은 API, 서버-DB 간은 SQL를 통해 서로 통신한다.

스프링부트는 서버(컨트롤러, 서비스, 리포지토리, JPA, DTO, Model...) 역할에 해당한다.

'백엔드 > Springboot' 카테고리의 다른 글

엔티티(Entity) -1-  (0) 2023.09.17
JPA 환경설정  (0) 2023.09.17
JPA  (1) 2023.09.17
ORM(Object Relational Mapping)  (0) 2023.09.17
컨트롤러  (0) 2023.09.17

+ Recent posts