#2022-02-28 ~ 2022-03-01#

 

*목차이자 오늘 한 일*

1. spring.io 홈페이지의 tutorial - quick start 부분 읽고 코드 작성

2. spring.io 홈페이지의 tutorial - building a restful web service 부분 읽고 코드 작성

3. 서버 포트 변경

 


 

#1

[참고한 포스트]

Spring | Spring Quickstart Guide

 

가장 기본인 hello world 창 띄우기.

DemoApplication.java 파일 하나만으로도 hello 메시지는 띄울 수 있다. 

 

(참고한 포스트에 있는 코드 원본을 그대로 가져왔다.)

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

	@GetMapping("/hello")
	public String hello(@RequestParam(value="name", defaultValue="World")String name){
		return String.format("Hello %s!", name);
	}

}

 

Spring에서는 @(Annotation)을 사용해서 각 클래스나 메소드에 역할을 부여하는 것 같다. 

 

@SpringBootApplication

프로젝트를 실행하는 메인 메소드가 포함된 클래스에 붙이면 해당 클래스 안의 메인 메소드에게 프로그램을 실행하는 역할을 부여하는 것 같다.  

 

@RestController

이 annotation이 붙은 클래스 안에는 맵핑(mapping)이 되어 있는 메소드들이 들어 있다. 즉 이 클래스 안의 메소드들은 어떤 HTTP 방식이든 웹의 url과 맵핑되어 반응한다. 

예시 코드를 보면, @RestController annotation이 붙은 DemoApplication 클래스 안에는 @GetMapping이 붙은 hello 메소드가 들어 있다. 

 

@GetMapping("url")

주어진 url로 HTTP GET 요청이 들어왔을 때 해당 메소드를 실행시킨다. 위의 경우 '/hello'로 GET 요청(일반적으로 주소를 url로 그냥 입력하면 GET 요청에 해당한다)이 들어오면 해당 메소드를 실행시킨다. 

 

@RequestParam(value="값이 처리될 변수의 이름")

말 그대로 입력값(parameter)을 받아서 해당 변수이름에 값으로 넣어 준다. 

예시 코드에서는 value="name"인데, 이러면 url 뒤에 오는 parameter의 값을 name이라는 변수에 할당해 준다. 

또한 해당 hello 메소드는 @RequestParam으로 받은 name 변수의 값을 매개변수로 사용해서 리턴하고 있다. 즉 url주소에 입력한 값이 화면에 출력되는 구조이다. 

 

+ @RequestParam() 안에 defaultValue라는 속성은 선택적으로 추가할 수 있다.

만약 url로 접속할 때 name="어떤 값" 과 같은 형식으로 parameter를 주지 않는 경우, 기본으로 사용할 값을 정해놓을 수 있다. 

예제 코드에서는 이 경우 "world"를 기본 값으로 정해놓았다. 

 


 

#2

[참고한 포스트]

Getting Started | Building a RESTful Web Service (spring.io)

 

이번에는 아까와 비슷하지만, url 주소 뒤의 쿼리(query) 형식으로 받은 변수를 json 형식으로 출력하는 코드이다.

DemoApplication.java, Greeting.java, GreetingController.java 3개의 클래스를 사용한다.

 

Greeting.java는 모델로 사용될 객체이다. json 형식으로 출력할 때, 어떤 필드들을 출력할지를 이 클래스에 정의해 놓는다. 

 

Greeting.java

(참고한 포스트에 있는 코드 원본을 그대로 가져왔다.)

package com.example.restservice;

public class Greeting {
	private final long id;
	private final String content;

	public Greeting(long id, String content) {
		this.id = id;
		this.content = content;
	}

	public long getId() {return id;}

	public String getContent() {return content;}
}

id와 content 필드는 모두 private, final 이므로 한 번 생성하면 변경할 수 없고, 외부에서 값을 바꾸려고 시도할 수 없다.

 

GreetingController.java

(참고한 포스트에 있는 코드 원본을 그대로 가져왔다.)

package com.example.restservice;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

	private static final String template = "Hello, %s!";
	private final AtomicLong counter = new AtomicLong();

	@GetMapping("/greeting")
	public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
		return new Greeting(counter.incrementAndGet(), String.format(template, name));
	}
}

 

Greeting.java 에서는 id 필드가 long 타입이었는데, GreetingController에서는 굳이 AtomicLong 타입의 래퍼 클래스(Wrapper Class)를 사용했다. long 타입을 객체로 할 이유는 없지만 아마도 AtomicLong 클래스의 incrementAndGet 메소드를 사용하려는 의도인 것 같다.

 


 

#3

서버 포트 변경

 

나는 이전에 사용하던 django 프로젝트에서 8080번 기본 포트를 미리 사용하고 있었기 때문에, spring을 실행해도 웹 페이지가 나오지 않았다.

 

이런 경우에는 본인의 프로젝트 이름을 P라고 하면, 'P>src>main>resources>application.properties' 파일에 서버 포트를 따로 변경해주면 된다. 

 

+application.properties 파일은 서버 포트를 바꾸거나, 기본 DB 대신 다른 DB를 사용하는 등 기본으로 설정된 사항을 바꿀 때 추가적인 옵션을 입력하는 파일이다. 

 

server.port = 1000

이렇게 한 줄만 입력하면, 다음부터 실행할 때 1000번 포트로 연결된다.

 


 

+ spring 공식 홈페이지의 accessing data with mysql 포스트를 보면서 정리한 ORM 개념

 

[참고한 포스트/영상]

Getting Started | Accessing data with MySQL (spring.io)

JPA, Hibernate, 그리고 Spring Data JPA의 차이점 (suhwan.dev)

https://youtu.be/JR7-EdxDSf0

Hibernate ORM 5.4.33.Final User Guide (jboss.org)

 

spring mysql 가이드를 보고 있는데 이런 코드가 나왔다. 

spring.jpa.hibernate.ddl-auto=update

hibernate는 무엇인가 싶어 검색해보니, 'Java 환경에서 제공하는 ORM 솔루션'이라고 한다.

 

그럼 ORM은 뭘까?

 

ORM: Object Relational Mapping

ORM이 왜 필요한가?

보통 프로그램을 작성하면서 여러 객체(object)를 만든다. 그러나 DB를 사용하는 경우 이 객체와 DB 안의 테이블을 연결해야 한다. SQL을 사용하여 직접 코드를 작성할 수도 있지만, SQL 코드를 사용할 필요 없이 프로그램에서 작성한 코드가 자동으로 DB에 해당 객체와 연결될 수 있는 테이블을 만들도록 할 수 있다. ORM 개념으로 이게 가능하다. (다만 모든 DB에 해당하는 얘기는 아니고, '테이블'이라는 개념이 있는 관계형 데이터베이스(Relational Database)에 해당한다고 한다.)

영상을 다 보지 않아서 모르지만, ORM이란 아마도 객체(object)와 데이터베이스를 서로 연결지어 맵핑(relational mapping) 하는 원리 또는 개념인 것 같다. Spring, Java에서도 당연히 이 ORM 개념이 있으며, 영상에서는 hibernation 개념도 이와 관련이 있다고 한다.

 

'server-side > spring' 카테고리의 다른 글

spring 개발일지 15-16강  (0) 2022.03.05
spring 개발일지 10-12강 + 개발 고민주제 틈틈이 정리  (0) 2022.03.04
spring 개발일지 5-6강  (0) 2022.03.03
spring 개발일지 4강  (0) 2022.03.03
spring 개발일지 1-3강  (0) 2022.03.02

+ Recent posts