티스토리 뷰

Spring Boot : 자바 기반의 웹 애플리케이션 개발을 위한 프레임워크인 Spring을 간편하게 시작할 수 있는 Spring 프로젝트 템플릿

  • 복잡한 XML (확장가능한 마크업 언어 : Extensible Markup Language : 데이터 구조화, 쉽게 데이터 교환할 수 있도록 만든 텍스트 기반 언어 ex) <name>nam</name>) 설정없이 직관적 개발 가능하게 해준다.
  • Spring Boot로 Rest API 구현

Rest API : Representational state transfer API(Application Programming Interface)

  • REST : 웹에서 데이터 주고받기 위한 표준화된 아키텍처 스타일. 자원 기반으로 해서 웹 서비스간에 데이터 교환하는 방식.
  • uri(uniform resource identifier)로 자원을 표현하고, http 메소드로 행동 표현하는, 무상태적, 일관된 웹 API
  • REST 원칙 : 1. 클라이언트-서버 구조 2. 무상태성(각 요청 독립적 처리, 서버는 이전 요청 상태 저장 안함) 3. 캐시 가능성(중간 계층에 일정 기간 동안 저장해두고 재사용할 수 있어야) 4. 일관된 인터페이스 5. 계층화 구조(클라이언트는 서버의 구조를 몰라도 된다.) 
  • REST API : REST 원칙에 따라 설계된 웹 기반 API
  • RESTFul API : REST 원칙을 엄격하고 충실히 따른 API

Spring Boot 기본 어노테이션

@SpringBootApplication 메인에 해당하는 진입이 여기다. 애플리케이션 시작점.
@RestController REST API 응답을 반환하는 컨트롤러로 선언
@GetMapping HTTP GET 요청을 처리하는 메소드에 사용(값을 갖고 오는 것, 받을 때 쓰는 것)
@PostMapping HTTP POST 요청 처리 메소드에 사용(값을 주는 것)
@RequestMapping GET/POST 등 HTTP 요청을 클래스/메소드에 매핑
@RequestParam 쿼리파라미터나 폼데이터 받아올 때 사용
@PathVariable URL 경로 내 변수를 가져올 때 사용. 인터넷에서 가져온 것을 이 변수에 담을거야.
@Autowired 스프링이 자동으로 빈(Bean, 스프링이 대신 만들어서 관리하는 객체)을 주입해주는 의존성 주입 어노테이션. 보통 생성자 만들어 주입하는데, 그 대신 의존성 주입해주는 노테이션
@Component 공통 Spring Bean 등록 기본, 다른 어노테이션의 상위개념
@Service 비즈니스로직 서비스 계층 나타냄
@Repository 데이터 접근 DAO(Data Access Object) 역할, db 접근하는 역할
@Entity 데이터 모델 JPA(Java Persistence API, 자바에서 객체와 데이터베이스를 매핑하기 위한 표준 API)에서 테이블과 매핑되는 클래스
반드시 @ld필드를 포함해야

실습1.

@RestController : 클래스가 REST API 응답 반환하도록 : 웹 요청 받아서 결과를 데이터로 바로 반환하도록 하는 것

@RequestMapping("/web") : /web 요청 오면 hello() 실행하도록 매핑(@GetMapping, @PostMapping 처럼 더 구체적으로도 가능)

 

@RestController(hello라는 데이터 그대로 화면에 보임) vs @Controller(hello.html 템플릿 파일 찾아 화면 만들어 반환) 

 

@Controller

@Controller //hello.html 파일 찾아서 웹페이지로 보여줌!
public class HomeController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

-> 이거 해보려다가 오류 났다. 원인을 모르겠다... 나중에 추가하기.

 

@RestController

@RestController // 브라우저에 그대로 "hello" 라는 문자열을 응답
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello"; 
    }
}

 

package kr.ac.ewha.java2.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")

public class HelloController {
	
	@RequestMapping("/web")//web이란 요청이 오면(요청이 브라우저에서 온다.)
	public String hello() {
		return "Hello Spring~!!❤❤❤😍😍";
	}
	
	@RequestMapping("/java")//java라는 요청이 오면 이걸 출력한다. 웹에서
	public String hi() {
		return "Hello Java~!! 안녕안녕❤❤❤😍😍";
	}
	
	public static void main(String[] args) {
		System.out.println("와! 브라우저에 스트링을 띄운다!");
	}
}

 


Spring Boot 핵심 원리

  • DI (의존성 주입, Dependency Injection) (IoC의 구현방식 중 하나)
    • @Autowired, 생성자 주입, Setter 주입으로 구현
    • 외부에서 생성된 의존 객체를 전달(주입)받는 방식, 의존성 관리를 프레임워크가 대신해준다.
  • IoC (제어의 역전, Inversion of Control)
    • 객체 생성부터 생명주기 전반 모든 걸 개발자가 아닌, 프레임워크가 대신하는 원리
    • 개발자는 필요한 기능만, 나머진 Spring이.
  • 자동 구성
    • Spring Boot의 가장 강력한 기능, 어플리케이션 설정 자동으로 구성한다.
    • @SpringBootApplication 안에 자동구성 활성화하는 게 들어있다.
    • 스프링은 프로젝트의 클래스들을 자동으로 훑어서 @Service, @Controller 같은 표시 붙은 애들을 알아서 객체로 만들어서(Spring bean) 관리하며, 기본적으로 하나만 만들고(싱글톤), 필요한 곳에 자동으로 넣어준다.(DI)

실습2 : 인사서비스 : @Autowired, @PostMapping 활용

패키지를 나눴고(service, controller 분리), user.html 파일을 static 폴더에 추가했다.

 

메인 들어있는 @SpringBootApplication

package kr.ac.ewha.java2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import kr.ac.ewha.java2.controller.GreetingController;

@SpringBootApplication
public class HelloSpring6Application {
	
	private final GreetingController greetingController;
	
	HelloSpring6Application(GreetingController greetingController){
		this.greetingController = greetingController;
	}
	
	public static void main(String[] args) {
		SpringApplication.run(HelloSpring6Application.class, args);
		System.out.println("START!");
	}

}

 

Controller패키지의 GreetingController

package kr.ac.ewha.java2.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import kr.ac.ewha.java2.service.GreetingService;

@RestController
public class GreetingController {
	
	@Autowired
	private GreetingService greetingService;
	
	@PostMapping("/hello")
	public String sayHello(@RequestParam(name="name") String name) {
		System.out.println(name);
		return greetingService.getGreeting(name);
	}
	
}

 

Service 패키지의 GreetingService

package kr.ac.ewha.java2.service;

import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;

@Service
public class GreetingService {
	public String getGreeting(@RequestParam("name") String name) {
		return "안녕하세요! "+name+"님! 오늘도 좋은 하루 보내세용~~~♥♥♥";
	}
}

 

static - user.html 파일

<html>
<body>
	<meta charset="UTF-8">
	<form method="post", action="http://localhost:8080/hello", accept-charset="UTF-8">
	<input type = "text" name="name" value="이름을 입력하세요" />
	<button type = "submit"> 보내기</button>
	</form>
</body>
</html>


흐름

1. 내가 웹 주소창에 입력 : http://localhost:8080/user.html

-> Spring Boot는 /static/user.html 파일을 그대로 브라우저에 보낸다. 

 

2. user.html 안에는 form 태그로 method="post", action="http://localhost:8080/hello", name="name"이 있다.

클라이언트인 브라우저가 서버인 Spring에 요청 보낼 때 요청 방식들이 있는데,

요청 방식 의미
GET 서버야, "정보 줘"
POST 서버 너에게 "데이터 보낼게, 네가 저장하고 처리해"
PUT 데이터 삭제
DELETE 데이터 통째로 업데이트

 

3. 이 중 POST 사용한다.

method="post" 때문에 "서버야, 네가 name 저장해서 처리해." 라고 말한다.

그리고 사용자가 이름 입력하고 보내기 버튼을 누르면 action에 있는 url로 이동한다.

<html>
<body>
	<meta charset="UTF-8">
	<form method="post", action="http://localhost:8080/hello", accept-charset="UTF-8">
	<input type = "text" name="name" value="이름을 입력하세요" />
	<button type = "submit"> 보내기</button>
	</form>
</body>
</html>

 

4. 그럼 GreetingController의 sayHello() 실행돼서 RequestParam으로 폼데이터 받아와서 greetingService.getGreeting(name) 함수가 실행된다.


CRUD를 이용해서 이름 입력하면 DB에 기록된 운세가 나오게 만들고 싶은데 시도하다가 포기했다...ㅎㅎㅎ

다음 수업 시간에 좀 더 배우고 해봐야겠다. 그래도 확실히 SpringBoot가 정말 편리하다는 생각을 했다. 의존성 주입도 Bean을 이용하고 annotation을 이용해 쉽게 할 수 있다는 게 신기했다. 

 

아, 그리고 실습 하는 도중에 static폴더에 집어넣는 html 파일의 이름을 index.html로 만들어놓고 웹주소를 http://localhost:8080/user.html을 입력해서 whitelabel 오류 페이지가 계속 떴었다. 지금 생각해보니 바보같지만 흐름을 잘 이해해야한다는 걸 깊이 느꼈다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함