SpringBoot + Next.js 복습2

황정성·2025년 10월 22일

REST API

다건조회

일단 컨트롤러 부터 만들자
domain패키지 안에 article.controller.ApiV1ArticleController.java 클래스를 만든다.

package com.rest.proj.domain.article.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.sql.ClientInfoStatus;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/articles")
public class ApiV1ArticleController {
    @GetMapping("")
    public List<Article> getArticles() {
        List<Article> articles = new ArrayList<>();
        articles.add(new Article());
        
        return articles;
    }
}

여러 아티클들을 조회 하기 위해 List로 반환하게 했다.

그리고 domain패키지에 entity.article.java 클래스를 만들어준다

package com.rest.proj.domain.article.entity;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class Article {
    private Long id;
    
}

간단하게 이정도만 해두고 나중에 천천히 수정하면서 하자.

이제 엔티티도 만들어 졌으니 다시 controller로 돌아와서 시험해보자

package com.rest.proj.domain.article.controller;

import com.rest.proj.domain.article.entity.Article;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/articles")
public class ApiV1ArticleController {
    @GetMapping("")
    public List<Article> getArticles() {
        List<Article> articles = new ArrayList<>();
        articles.add(new Article(1L));
        articles.add(new Article(2L));
        articles.add(new Article(3L));

        return articles;
    }
}


잘 된다

단건조회

@GetMapping("/{id}")
    public Article getArticle(@PathVariable("id") Long id) {
        Article article = new Article((id));

        return article;
    }

우선 다건이랑 비교해서 List에서 article로 바뀌었고 메서드 이름도 단수로 바꿨다.
GetMapping에서 아이디를 받고 함수의 인자로 @PathVariable("id") Long id를 받게 했다.
아티클 객체를 만들어서 Entity에 썼던 생성자 어노테이션으로 아이디를 통해 아티클 조회가 가능하게 했기에 아티클 객체를 만들어서 조회하는 기능을 넣었다.

잘 된다.

API 확인

대부분 POST MAN을 쓰는데 나는 "모-던 개발자"가 되기 위해 APIDOG를 쓰겠다.
APIDOG의 장점은 API생성, 관리, 조회가 가능하다는 거다.(그 이외의 기능도 많음)

잘된다

API 시큐리티 설정

global 패키지안 security 패키지에 ApiSecurityComfig.java클래스를 만들자

package com.rest.proj.global.security;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class ApiSecurityConfig {
    @Bean
    SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
        http
                .securityMatcher("/api/**")
                .authorizeRequests(
                        authorizeRequests -> authorizeRequests
                                .requestMatchers("/api/*/articles").permitAll()
                                .anyRequest().authenticated()
                )
                .csrf(
                        csrf -> csrf
                                .disable()
                );
        return http.build();
    }
}

이렇게 작성하면 된다
@Configuration 어노테이션은 스프링에서 해당 클래스를 설정 클래스로 만들어준다.
@EnableWebSecurity 스프링 시큐리티 설정을 활성화 해준다

권한설정 메소드 안에서
requestMatchers("/api/*/articles").permitAll()
아티클에 경로에 대한 권한은 인증없이 접근 가능하게 했다
anyRequest().authenticated()
그외의 모든 권한은 인증을 필요로 하게 했다.

그리고 csrf를 잠깐 비활성화 하게 했다

0개의 댓글