Java REST API 실습
REST API를 너무 해보고 싶어 하나 하나 전부 뜯어 보려한다. 강의를 사서 볼까도 했지만, 오기가 생겨서 다 찾아보고 적어보려고 한다. 스프링 부트의 어노테이션에 관한 것도 같이 올릴 것이다. 또한 하루만에 완성하는 포스팅이 아니기 때문에, 수정날짜를 밑에 적도록 하겠다.
Data어노테션의 경우 getter setter tostring hashcode equals전부 만들어주는 어노테이션으로 lombok 라이브러리에서 사용이 가능하며,
@Getter, @Setter, @ToString, @EqualsAndHashCode 로 나누어 사용도 가능하며, get, set, toString, eqauls, hashcode 원하는 메서드를
사용할 수도 있다.
@NoArgsConstructor
파라미터가 없는 생성자를 만들어주는 어노테이션이다.
@AllArgsConstructor
모든 파라미터로, 모든 필드에 대한 생성자를 만들어주는 어노테이션이다.
@Entity
@Entity는 DB의 테이블과 일대일로 매칭되는 객체의 단위이며, 기본 생성자가 필요하고, 필드에 final interface class를 사용할 수 없다. 또한 name
을 주면 엔티티의 이름을 지정하고 @Entity가 붙은 클래스는 JPA에서 관리하게 된다.
@Table(name = “”)
@Table없이 테이블을 생성하게 될 경우 Entity 클래스의 카멜표기법을 유지한 상태로 테이블이 생성되기 때문에 작성해주는 것이 관례이다.
@Id
@Id어노테이션을 인스턴스에 붙이게 될 경우, PK와 같은 의미가 된다. 또한 @GerneratedValue를 사용할 경우 해당 변수의 수가 자동으로 증가하게 된다.
(sequence와 같은 의미.)
Spring Data JPA 쿼리 메소드안에 지원되는 키워드 findBy 이런 형태가 쿼리 메소드 구문 이러면 자동으로 sql구문을 만들어 준다. 지원되는 키워드는 happygrammer님의 블로그에 정리가 되어있어 링크해두겠다.
OrElseThrow 메소드
해당 메소드의 경우 java.util.Optiona을 임포트하여 사용이 가능하고, 실습 중에서는
Optional
추가적인 부분은 현재 The type org.springframework.util.MultiValueMap cannot be resolved. It is indirectly referenced from required .class files
에러가 나서 이후에 올려보겠다.
2021-06-11
어제의 에러는 spring-core자르 파일이 문제가 있어 발생하여 외부에서 파일을 가져와 라이브러리를 추가하니 해결이 되었다.를 하자마자 새로운 오류
Consider defining a bean named ‘entityManagerFactory’ in your configuration. 발생, 해결하고 돌아와야지…
이 부분은 톰캣 버전을 9로 맞춰주고 .m2폴더에 hibernate폴더를 지우고 다시 빌드하여 문제를 해결하였다.
2021-06-12
정의해 두었던 메소드를 사용하여 데이터를 삽입 실행시에 테이블을 생성하게 하여 실행하였을 때 데이터가 삽입되고, 테이블이 만들어지는 것을 확인,HeildiSql에
데이터가 담기고 브라우저에 해당 데이터들이 제이슨형태로 보여지는 것까지 확인하였다. 예전 legacy로 한 프로젝트 안에서 모든걸 처리할 때, 컨트롤러의 리턴
값을 JSP로 보내주었었는데, 이것을 레스트 API에선 리턴 값을 상태코드와 같이 보내주는 것을 보고, 머리속으로 그려지던게 조금 더 가까이 느껴졌다. 이제
초석은 다졌으니 레스트 API의 제약 조건을 조금 더 알아보고 추가해보고 기존에 만들었던 프로젝트를 API화 시켜 REST방식으로 통신하는 것까지 진행해 보겠다.
이 연습은 여기서 끝~
2021-06-13
Hateoas
Rest Api의 제약 조건중 Hateoas의 제약 조건이 제일 맞추기 어려운 것을 보았다. Hypermedia As The Engine Of Application State의 약자이다.
Hateoas는 링크를 통하여 어플리케이션의 상태가 전이되어야 하고, 링크에 자신의 정보가 담겨야 한다는 것이다. 이 말의 뜻은, 링크의 URI자원이 명시되어 있어야
하며, 클라이언트가 서버와 동적으로 상호작용이 가능하다는 말이다. 클라이언트가 서버에 POST요청을 보냈다고 가정했을 때, 이에 의존되는 GET, PUT, DELETE등의
URI를 Reponse에 포함하여 반환 시킨다.
응답 예:
{
"data": {
"id": 1000,
"name": "게시글 1",
"content": "HAL JSON을 이용한 예시 JSON",
"self": "http://localhost:8080/api/article/1000", // 현재 api 주소
"profile": "http://localhost:8080/docs#query-article", // 해당 api의 문서
"next": "http://localhost:8080/api/article/1001", // 다음 article을 조회하는 URI
"comment": "http://localhost:8080/api/article/comment", // article의 댓글 달기
"save": "http://localhost:8080/api/feed/article/1000", // article을 내 피드로 저장
},
}
이 부분은 지켜지지 않고 있는 API들이 많으며, 스프링의 라이브러리를 사용하여 조금 더 쉽게 접근할 수 있기 때문에 다음엔, 라이브러리에서 제공하는 것을, 사용하여 적용시켜 보겠다.
출처: 오라클 자바 커뮤니티 Wonit 깃허브: sanseongKo