@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "안녕 스프링!";
}
}
Spring을 배우기 이전에 아주 근본적인 궁금증부터 해결해 보기로 했다.
[사용자 (브라우저)]
V 클릭
[React/Next.js] ——— 요청(fetch/axios) ———▶ [Spring 서버]
V
[Service → DB]
V
응답(JSON 형태로 보내줌)
이제부터는 프론트에서 API만 쓰는 게 아니라, 그 API 자체를 만드는 쪽
이게 스프링 백엔드의 본질.
Spring이란?
자바로 백엔드 웹 서비스를 쉽게 만들 수 있게 도와주는 프레임워크!
Java백엔드=서버를 만드는 것 (요청받고 처리하고 응답까지)
그런데 자바로 직접 다 만들려면 너무 복잡하고 힘이 든다. 🥲
그래서 Spring이라는 프레임워크가 등장..
Spring
반복 작업을 줄여주고 기본 구조를 만들어줘서 개발자가 핵심 로직에만 집중할 수 있다.
비교) 프론트 입장에서 보면, React는 화면(UI)을 구성하는 프레임워크, Spring은 데이터를 처리하고 응답하는 서버 역할.
스프링의 핵심 기능
- Controller : React의 라우터 같이 URL을 매핑해주는 곳.
→ /users 요청이 들어오면 어떤 함수가 처리할지 연결
- Service : 진짜 중요한 비즈니스 로직 (계산, 조건처리 등)
- Repository : DB랑 연결해주는 역할(데이터 저장/조회)
- Model/ Entity : DB테이블처럼 생긴 자바 클래스 (User, Produce 등)
- DI (의존성 주입) : 필요한 객체를 자동으로 연결해주는 기능 (React에서 props, context, useEffect처럼 뭔가 연결해주는 느낌)
스프링 부트???
스프링을 더 쉽게 빠르게 쓸 수 있돌고 만들어진 툴킷
스프링 설정이 너무 복잡해서 Spring Boot가 등장
React에서 CRA(Create React App)처럼 프로젝트 뼈대를 만들어주는 느낌
내장 Tomcat 서버 덕분에 main()만 실행하면 바로 서버가 동작함
쉽게 말해 스프링 부트는 "스프링의 귀찮은 설정을 자동으로 처리해주는 도우미"
스프링(Spring) 스프링 부트(Spring Boot)
스프링(Spring) | 스프링 부트(Spring Boot) | |
정의 | 백엔드 웹 애플리케이션 프레임워크 | 스프링을 쉽게 쓸 수 있게 도와주는 툴킷 |
특징 | 설정이 너무 복잡함(XML, 수동설정 등) | 설정을 자동으로 해줌!(자동 설정, 내장 서버 등) |
실행 방식 | 따로 서버 필요 (Tomcat 설치) | 실행만 하면 서버가 바로 뜸 (main() 누르면 끝) |
개발 속도 | 느림 (초기 세팅 귀찮음) | 빠름 (개발자 행복도 상승) |
구분 React/Next (프론트) Spring (백엔드)
React/Next (프론트) | Spring (백엔드) | |
구성 | 컴포넌트 중심 | 계층 구조 (Controller → Service → Repository) |
라우팅 | react-router | @GetMapping("/url") |
상태관리 | useState, Redux | 서비스/DB 내부 처리 |
비동기 처리 | fetch, axios | 내부에서 @Async or 동기 기본 |
시작 | npm start | main() 실행 또는 ./gradlew bootRun |
간단정리
1 | 스프링 부트 프로젝트 생성법 | CRA처럼 스프링 부트 프로젝트 뼈대 만드는 방법 |
2 | Controller 개념 + @GetMapping, @PostMapping | URL → 함수 연결. 라우팅. react-router-dom 느낌 |
3 | 요청 받기: @RequestParam, @PathVariable, @RequestBody | 사용자 입력값을 서버에서 받는 법 (폼, fetch 등과 연동) |
4 | 응답 보내기: JSON 응답 | React로 fetch 했을 때 JSON으로 응답 주는 방법 |
5 | DTO란? | 요청, 응답 데이터 구조화 클래스 (props 느낌) |
6 | Service 개념 | 로직 처리하는 레이어. 계산, 조건, 로직 등 수행 |
7 | Repository + DB 연결 | 실제로 데이터를 저장하거나 불러옴 (JPA, H2부터 시작) |
8 | 의존성 주입(DI) | Spring이 자동으로 객체 넣어주는 기능 (생성자 기반으로 주입) |
9 | application.properties 설정 | 프로젝트 설정파일. 포트, DB 연결, 로그 설정 등 |
10 | (보너스) Postman, Swagger | API 테스트 툴. 프론트 없이도 API 테스트 가능! |
질문 정리
Q1. @GetMapping("/url") 이거 라이브러리인가? (npm install react-router-dom 같은)
No. 이건 자바의 "어노테이션"이라는 문법이고, 컴파일 시 자동으로 작동되는 설정
@GetMapping("/url")는 Spring Web이라는 스프링 라이브러리의 일부 기능
이걸 쓰기 위해선 프로젝트 생성 시 spring-boot-starter-web을 포함해야 함
React에서는 npm install react-router-dom으로 라우팅 설정했는데,
스프링에서는 @GetMapping, @PostMapping으로 URL에 따라 메서드를 맵핑해주는 방식임.
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello from Spring!";
}
}
///hello로 요청하면 저 함수가 실행됨 → 반환값 "Hello from Spring!"이 브라우저에 출력됨
Q2. 자바세상에는 패키지 매니저가 없는가?
No. 자바 쪽에서는 Maven이나 Gradle이라는 패키지 매니저가 존재함.
프론트 (JS) 백엔드 (Java)
npm, yarn | Gradle, Maven |
npm start | ./gradlew bootRun 또는 main() 실행 |
- package.json → build.gradle
- npm install → ./gradlew build (또는 IntelliJ가 자동 관리)
또는 IntelliJ에서 main() 우클릭 → Run 하면 바로 실행됨
→ localhost:8080으로 서버가 뜸 (React처럼 3000 아니고)
Q3. fetch/axios는 외부 API 요청인데, 스프링은 자체가 API 만드는 거 아닌가??
Yes. 정말 날카로운 질문
- React에서는 외부 API 호출(fetch/axios)
- Spring은 API를 직접 만드는 쪽 (서버 역할)
스프링도 다른 외부 서버에 요청하고 싶을 때가 있음.
→ 이럴 땐 자바에서는 RestTemplate, WebClient를 사용해 fetch/axios와 유사한 역할
@RestController
public class ExternalApiController {
@GetMapping("/external")
public String callOtherApi() {
RestTemplate rt = new RestTemplate();
String response = rt.getForObject("https://api.example.com/data", String.class);
return response;
}
}
@Async는 뭐냐면, 내부에서 비동기 작업을 처리하고 싶을 때 쓰는 거임
@Async
public void backgroundJob() {
// 오래 걸리는 작업
}
Q4. 서비스/DB 내부 처리??
useState는 클라이언트(브라우저)에서 데이터 저장이지만
스프링의 Service/Repository는 서버 내에서 로직 처리 + DB 저장
예시: 사용자가 이름을 입력하면 → 서버에서 DB에 저장 → 다시 목록 보여줌
예시 코드 (스프링 구조)
- useState는 브라우저 메모리에 저장
- Spring은 실제 DB에 저장하고 → 요청받아서 응답까지 함
// 1. Entity (DB 테이블처럼 생김)
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String name;
}
// 2. Repository (DB 저장소)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
// 3. Service (로직 처리)
@Service
public class UserService {
private final UserRepository repo;
public UserService(UserRepository repo) {
this.repo = repo;
}
public void saveUser(String name) {
User user = new User();
user.setName(name);
repo.save(user); // DB에 저장
}
public List<User> findAllUsers() {
return repo.findAll(); // 전체 목록 불러오기
}
}
// 4. Controller (API 노출)
@RestController
public class UserController {
private final UserService service;
public UserController(UserService service) {
this.service = service;
}
@PostMapping("/user")
public void createUser(@RequestParam String name) {
service.saveUser(name);
}
@GetMapping("/user")
public List<User> getUsers() {
return service.findAllUsers();
}
}
'Spring_부캠' 카테고리의 다른 글
[Spring]MVC (4) | 2025.07.23 |
---|---|
[Spring] 인텔리제이 불편함 드디어 개선함 (3) | 2025.07.23 |
[Java] 제발 기억해 (0) | 2025.07.18 |
[Java] OOP (0) | 2025.07.16 |
[Java] SSR & Refactoring (0) | 2025.07.15 |