REST API & GraphQL

웰시고기·2021년 2월 12일
0
  • REpresentational State Transfer의 약자로 개발자가 API를 만들 때 사용하는 일종의 가이드라인이다.
  • 4가지 원칙을 따른다
    - API의 데이터나 기능성은 자원(Resource)으로 고려되며 URI를 통해 식별된다.
    • GET, POST, PUT, DELETE의 고정된 메소드를 통해 자원이 조작된다.
    • 자원은 HTML, XML 등의 다양한 형식으로 표현될 수 있다.
    • 클라이언트와 서버의 상호작용은 상태를 보존하지 않는다.(stateless)

annotation

  • @Entity : DB의 테이블과 테이블에 포함된 row를 주어진 entity로 표현할 수 있게 한다.
  • @RestController : @Controller와 @ResponseBody의 조합으로 REST API 클래스임을 표시한다.

GraphQL

API의 쿼리 언어로 서버로부터 클라이언트가 원하는 데이터를 요청할 수 있는 문법을 제공한다.

  • Schema : API에 의해 제공되는 데이터를 정의한다. 스키마는 데이터 타입을 정의하고 데이터를 가져오는 Query나 데이터를 수정(CRUD)하는 Mutation을 포함한다.
type Location {
 id: ID!
 name: String!
 address: String!
}

type Query {
 findAllLocations: [Location]!
}

type Mutation {
 newLocation(name: String!, address: String) : Location!
 deleteLocation(id:ID!) : Boolean
 updateLocationName(newName: String!, id:ID!) : Location!
}
  • 다음과 같이 코드를 작성한 후 POSTMAN으로 API를 호출하면 원하는 데이터만 가져올 수 있다.
@Component
public class Query implements GraphQLQueryResolver {
    private final DogRepository dogRepository;

    public Query(DogRepository dogRepository){
        this.dogRepository = dogRepository;
    }

    public Iterable<Dog> findAllDogs(){
        return dogRepository.findAll();
    }

  • GraphiQL : GraphQL 서버와 통신할 수 있게 해주는 간단한 웹앱이다.

Spring Security

  • 허용된 사람만 API를 사용할 수 있도록 Spring Security에서는 Authentication을 통한 인증과 Authorization을 통한 인증 후 권한 설정을 할 수 있다.
  • 토큰을 통한 인증이나 기본적인 아이디와 비밀전호를 통한 인증 등이 있다.
  • 다음과 같이 설정하여 아이디와 비밀번호를 통한 인증을 구현할 수 있다.
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin")
                .password(encoder().encode("password"))
                .roles("USER");
    }

    @Bean
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder();
    }
}

0개의 댓글