일단 컨트롤러 부터 만들자
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에 썼던 생성자 어노테이션으로 아이디를 통해 아티클 조회가 가능하게 했기에 아티클 객체를 만들어서 조회하는 기능을 넣었다.

잘 된다.
대부분 POST MAN을 쓰는데 나는 "모-던 개발자"가 되기 위해 APIDOG를 쓰겠다.
APIDOG의 장점은 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를 잠깐 비활성화 하게 했다