It's going to be one day 🍀

안녕하세요! 매일 매일 공부하려고 노력하는 백엔드 개발자 지망생의 공부 흔적입니다.

Back-End/Spring

[Spring] 스프링 기초/스프링부트 실습

2jin2 2024. 2. 28. 15:57

엔터프라이즈 애플리케이션 : 대규모의 복잡한 데이터를 관리하는 애플리케이션

복잡하고 어려운 웹 어플리케이션 구현 암흑기를 지나, 개발자의 어려움을 해결해주는 Spring 봄처럼 등장!

 

스프링이란? 

자바 기반의 엔터프라이즈 애플리케이션 개발을 위한 프레임워크임.

- 개발자들이 복잡한 서버 성능과 안정성, 보안 등을 고려하지 않고도 기능 개발에 집중할 수 있도록 도와줌.

- 다양한 기능을 제공하며, 의존성 주입 (Dependency Injection) 관점 지향 프로그래밍 (Aspect-Oriented Programming) 등의 개념을 통해 애플리케이션을 유지보수하기 쉽도록 도와줌.

 

+) 의존성 주입이란, 우리가 클래스를 가지고 객체를 생성하는 것을 개발자가 직접 하는게 아니라 스프링 프레임워크에서 주입해줌. (= 개발자가 직접 객체를 생성new하지 않고도, 스프링 프레임워크에서 대신 해줌)

+) 관점 지향 프로그래밍이란, 개발자가 비즈니스 핵심 로직만 구현할 수 있도록 도와줌.


스프링 부트 프로젝트 직접 만들어보기!

- Gradle-Groovy : 빌드할 때도 사용하고, 하나의 파일로 말아줄 때 사용함(후에 서버 배포). 개발자가 필요한 라이브러리를 가져다주는 역할을 함.

SNAPSHOT : 개발중, M1 : 정식버전 아님

 

코드 생성 (동적 컨텐츠 호출)

package com.estsoft.hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

-> com.estsoft.hello.HelloApplicationTests 를 실행하면 로컬호스트8080 에서 사이트를 열 수 있음. 

아직 아무 내용도 없어서 이렇게 뜬다

package com.estsoft.hello.controller;

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

@RestController
public class HiController {
    @GetMapping("/hi") // localhost:8080/hi
    public String test(@RequestParam(value = "name", defaultValue = "word!") String name) {
        return String.format("Hello %s!", name);
    }
}

-> com.estsoft.hello.controller.HiController.java 에서 컨트롤러를 설정해주고 다시 서버를 띄우면

localhost:8080/hi

-> 이렇게 생성된 것을 볼 수 있음! 주소창에서

localhost:8080/hi?name=queryparameter

queryparameter 내용을 수정하면 수정한 내용이 반영된다. 그래서 동적인가보다!

 

코드 생성 (정적 컨텐츠 호출)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
static content : Hello World!
</body>
</html>

-> resources.static.hello.html 

localhost:8080/hello.html


자바 코드로 어노테이션을 사용해서 스프링의 기능들을 쓸 수 있다!

 

스프링(Spring)에서 자주 사용하는 Annotation 개념 및 예제 정리 - Easy is Perfect

 

melonicedlatte.com

-> 복습할 때 한번 쭉 읽기


PostMapping 실습 (& PostMan)

@PostMapping 참고

 

-> 나는 /hi (위 예시에선 /user)로 들어오는 요청을 모두 처리하려고 하는 것이다.

@RequestBody 참고

밑에 있는 예시를 정리하자면, postman에서 코드를 입력하고 send를 누르면 json 형태로 값이 전달되는데, @RequestBody에서 해당 내용을 Java Object로 변환하여 전달해줘서 실행한 Java sout 콘솔에 찍히는 것이다!

 

실제 실습 내용)

// POST localhost:8080/hi
// POST 요청이니까 클라이언트 쪽에서 뭔가 값을 전달해줄 것임.
@PostMapping("/hi")
public String postTest(@RequestBody String value) { // 그걸 value로 받아줌.
    System.out.println("value = "+value);
    return value; // json 형태로 리턴된다.
}

PostMan에서 POST에 localhost:8080/hi를 Send했다. 그리고 Body에 value를 입력해주면 값이 찍혀나온다.

 

어떻게 하는진 알겠는데, 그래서 이걸로 뭘 하는거지..? 아직은 잘 모르겠다

 

ObjectMapper 실습 (& PostMan)

ObjectMapper는 json을 java object 형태로 deSerialize 해준다. 아래의 실습 예시로 복습하자.

@PostMapping("/hi")
public String testPost(@RequestBody String value) { // 그걸 value로 받아줌.
     ObjectMapper objectMapper = new ObjectMapper();
    // json -> java object  : deSerialize
    try {
        Person person = objectMapper.readValue(value, Person.class);
        // Person.class 한 이유는 readValue 자체가 (클래스명).class 로 받아와야하기 때문이다.
        System.out.println("person = "+person);
    } catch (JsonProcessingException e) {
        System.out.println(e.getMessage());
    }
    System.out.println("value = " + value);
    return value; // json
}

-> 다시 한번 더 정리하면, Postman에서 입력한 json을 java object로 바꿔주는 실습이다.

objectMapper를 사용해서 person과 value에 값을 받아오고 sout로 출력한다. 에러를 방지하기 위해 예외처리를 해준다.

Send가 잘 되었기 때문에 200 OK 문구가 보인다.

이렇게 Postman에서 json으로 값을 입력해주고 Send 후 인텔리제이 출력 결과를 확인해보았다.

json -> java object가 이루어져 person과 value에 값이 잘 담긴걸 확인 할 수 있었다!

뭔가 신기하고 재밌다 ㅎㅎㅎㅎ


1. 클라이언트와 서버

- 클라이언트 (웹 브라우저) : 서버에 다양한 정보를 요청 ex) Postman

- 서버 : 클라이언트가 요청한 내용을 처리 ex) SpringBoot

 

2. 서버의 이해

서버

서버는 계속 대기하고 있다가 클라이언트의 요청이 있을 때 거기에 응답하는 장치 또는 프로그램이다. 서버가 다운되었다(= 서버가 대기 상태가 아니어서 클라이언트 요청에 응답을 할 수 없는 상태이다.)

 

웹 서버

"웹"을 제공하는 역할

-> 사용자가 웹 브라우저에서 www.naver.com을 입력했을 때 네이버의 웹 서버가 이를 알아채고 응답한다. 웹 서버가 응답을 보낸 자원을 이용해서 웹 브라우저는 화면을 그린다.  

이때 2가지 경우가 있다. 정적인 컨텐츠를 가져올 때와, 동적인 컨텐츠를 가져올 때다. 위에서 코드로 실습해본 내용이다.

 

정적인 컨텐츠로 응답

이 경우에는 데이터베이스를 사용하지 않아도 바로 웹서버에서 정보를 꺼내 응답할 수 있음.

1. 사용자 A가 브라우저에서 HTML 페이지(static contents)를 요청함.

2. 웹 서버가 요청에 해당하는 static 한 페이지를 찾아서 응답함.

동적인 컨텐츠로 응답

1. 사용자 A가 정보를 요청함.

2. 웹 서버가 사용자 A의 정보를 데이터베이스에서 가져오기 위한 비즈니스로직을 실행함.

3. 데이터베이스에서 사용자 A의 정보를 꺼내어 응답함.

웹 서버는 클라이언트의 다양한 요청을 처리하기 위해 비즈니스로직이라는 것을 미리 준비해둠. 웹 서버는 여러 개의 비즈니스 로직이 합쳐진 것임. 비즈니스로직을 만드는 Java의 규격 이름은 Servelt

정리하자면, 자바를 이용해 웹 페이지를 동적으로 생산하는 백엔드 웹 애플리케이션 개발 기술을 Servelt 이라고 함.

+) Servelt은 Tomcat의 역할과 비슷하다 (ex 문 역할)

Servelt에 대해선 추후에 더 자세하게 배울듯

 

위에서 실습한 코드를 그림으로 보면,

DispatcherServlet은 이어주는 중간 다리 역할을 함