REST 기초CRUD REST APIPagination and SortingLogin/Signin and SignupLombokException handlingValidation시큐리티 적용 ( 허가 및 인증 )Query methods Spring Data JPAOne
JDK : 11프레임워크 : 스프링 부트, 스프링 시큐리티 (JWT), Spring Data JPA (Hibernate)빌드툴 : 메이븐IDE : STS서버 : 톰캣 임베디드DB : MySQLREST 클라이언트 : PostmanREST API Documentation
RESTRepresentational State Transfer의 약자로,🍗 웹에 존재하는 모든 자원(이미지, 동영상, 텍스트 등 데이터)에 고유한 URI를 부여하여 해당 자원에 대한 주소를 부여하는 것!🍗 웹 서비스를 만드는데 사용되는 제약(constraint)의
리소스 영화관련 사이트를 만들때 영화 리소스가 필요 통합 자원 식별자(Uniform Resource Identifier, URI)는 인터넷에 있는 자원을 나타내는 유일한 주소이다.
주요 메소드GET리소스를 조회 할때 사용한다.서버에 데이터를 전송 할떄는 query를 사용해서 전달한다.(?data=hello&value=hello)POST요청 데이터 처리, 주로 등록에 사용message body를 통해 서버로 요청 데이터를 전달한다.PUT리소스
요청이 성공적으로 되었습니다. 성공의 의미는 HTTP 메소드에 따라 달라집니다:GET: 리소스를 불러와서 메시지 바디에 전송되었습니다.HEAD: 개체 해더가 메시지 바디에 있습니다.PUT 또는 POST: 수행 결과에 대한 리소스가 메시지 바디에 전송되었습니다.TRACE
□ Persistence, 영속성데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터 특성을 의미한다.영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 잃어버린다.파일 시스템, 관계형 데이터베이스, 객체 데이터베이스 등을 활
페이지사이즈, 페이지넘버 , 정렬할 열을 쿼리스트링으로 요청하나의 포스트에 해당하는 댓글 모두 가져옴하나의 포스트에 하나의 댓글을 아이디로 가져옴포스트에 새 댓글을 생성포스트에 특정(id) 댓글을 생성포스트에 특정(id) 댓글을 삭제API 설계https://v
Generate 로 생성해서 압축파일을 다운로드해서 워크스페이스에 붙여넣고 압축을 풀기롬복 미설치시 설치https://blog.naver.com/drv982/222632470503
controller : 컨트롤러 클래스 패키지entity = model , domain : DB 데이터와 매핑 자바 클래스 패키지repository : 리파지토리 클래스 패키지service : 서비스 인터페이스service.impl : 서비스 인터페이스 구현 클래스ex
application.properties 하이버네이트 설정(개발 초기용) 에러없이 실행 확인
DB테이블의 이름 posts와 매핑됨, 유니크설정 열은 title (title은 중복방지)생성자 모든필드변수 적용, 기본 빈생성자열이름 "title"과 매핑 (이름 같음) , 널값 허용 안됨하이버네트 설정에서 Post클래스와 매핑된 테이블 자동 생성
왜 id Long 타입?https://www.inflearn.com/questions/35759Primitive 타입은 null이 될 수 없기 때문에, null 값을 정확하게 처리하기 위해서 Wrapper 클래스를 사용한다.id==null 으로 비교 가능 in
RuntimeException 상속 : 실행중 예외 발생 처리예외발생시 응답으로 Not Found 에러 출력예외는 리소스(포스트,댓글,유저)를 id등으로 검색했는데 DB에 없는 경우에 발생Post not found with id : 1 와 같은 문자열로 예외 메세지 생
Post 클래스의 내용을 카피
참고https://madplay.github.io/post/why-constructor-injection-is-better-than-field-injectionhttps://cheershennah.tistory.com/179
포스트맨을 실행해서 테스트용 데이터 입력 DB에도 저장됨 확인 두번째 세번째 포스트도 입력 확인 DB ![](https://images.velog.io/images/drv98/post/b1
참고https://ikkison.tistory.com/82https://codechacha.com/ko/java8-convert-stream-to-list/
1. PostService 추가 2. PostServiceImpl 3. 컨트롤러 4. 테스트
1. PostService 2. PostServiceImpl
1. PostService 2. PostServiceImpl 3. 컨트롤러
pageSize, pageNo 옵션 쿼리스트링 디폴트 값 적용하여 없어도 에러가 발생하지 않게 1. PageController pageNo = 0 , pageSize = 10 디폴트 2. PostService 3. PostServiceImple ![](https://images.velog.io/images/drv98/post/42c
💥 현재 페이지 리스트 데이터만 클라이언트에 리턴하는 것에서 더하여 총 포스트 숫자 , 전체 페이지 숫자, 현재 페이지가 마지막인지?이런 정보를 더해서 한꺼번에 클라이언트에 제공하도록 하자.
/api/posts?pageNo=1&pageSize=5&sortBy=id&sortDir=dec 1. 컨트롤러 2. PostService 3. PostServiceImple
💨 posts 의 id를 comments의 post_id 로 참조💦 부모(참조된Post의 id)의 값이 바뀌거나 삭제될때 참고하는 자식열(forign key)들은 삭제가 된다. 만약 삭제가 되지 않게할려면 대신 CascadeType.REMOVE 를 뺀 값입력casc
CommentRepository
1. 서비스 2. 서비스impl (인터페이스 구현)
리파지토리 커스텀 쿼리 작성 서비스 서비스 구현 컨트롤러
서비스 서비스 구현
1. 서비스 2. 서비스 구현 컨트롤러 테스트
1. 서비스 2. 서비스 구현
http://modelmapper.org/메이븐으로 프로젝트 업데이트PostServiceImle 클래스CommentServiceImle에도 똑같이 ModelMapper를 적용하라.참고https://wordbe.tistory.com/entry/Sprin
@Data 일때 자동으로 댓글의 포스트 댓글 포스트 댓글로 무한 반복됨
💦 현재 포스트맨으로 요청시 컨트롤러 => 서비스로 가서 postId, commentId 로 포스트와 댓글을 찾는데 이때 리소스가 없으면 RsourceNotFoundException을 발생시켜 예외처리를 하고 있다.이때의 결과 화면을 포스트맨으로 확인💦 위의 에러
💦 서비스에서 발생할수 있는 특정 예외들을 모아서 한번에 같은 형식으로 처리하는 클래스를 만들자.💦 이때 ErrorDetails 클래스에 시간, 메세지, 디테일을 넣어 만들자.@ExceptionHandler@ControllerAdvice참고https://j
@NotNull 널값이 아닐것@Size min(최소) and max(최대) 문자열의 길이 @Min 최소값@Max 최대값@Email 이메일 형식에 맞아야 함@NotEmpty 널값 또는 빈 배열, 컬렉션이 아닐것@NotBlank 널값 또는 공백이 아닐것 💢 설치후에 ma
참고https://www.baeldung.com/javax-validationhttps://sanghye.tistory.com/36
GlobalExceptionHandler 테스트
CommentDto 설정 새 댓글 입력, 댓글 업데이트 @Valid 적용 테스트
💨 디폴트 userid = user 이다. 패스워드는 시작시 콘솔에 표시됨💨 스프링 시큐리티가 시작되면 모든 url 주소에 적용됨임시 user , pass 를 만들면 랜덤 패스워드가 생성되지 않음
csrf() : CSRF 보안에 대한 설정입니다. 아무 설정도 하지 않으면 CSRF 보안을 하도록 설정됩니다.disable() : 해당 기능을 해제 합니다. 여기서는 csrf()를 해제합니다.authorizeRequests() : 요청에 대한 권한 지정. Securit
userDetailsService 메소드에 메모리인증용 유저와 관리자 생성 관리자만 가능 포스트 생성, 업데이트 ,삭제 추가 포스트를 생성 해보자 ADMIN 계정으로 정보 수정후 생성
User참고https://ict-nroo.tistory.com/132
UserRepository RoleRepository
참고https://programmer93.tistory.com/68
💦 private CustomUserDetailsService userDetailsService; @Autowired 로 필드주입(DI)
Role_USER 계정으로 시도Role_admin 계정으로 시도
참고https://kogle.tistory.com/31
SignupDto AuthController 객체 필드 주입(DI) 유저네임이나 이메일이 등록되어 있을 경우
JWT 는 JSON Web Token의 약자로 전자 서명 된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON입니다.전자 서명은 JSON 의 변조를 체크 할 수 있게되어 있습니다.JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준 입니다.JW
3개의 파트로 .(점)으로 구분됨 https://jwt.io/#debugger-io
https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt프로젝트 clean 메이븐 업데이트 project워닝 => 프로퍼티 자동생성생성된 프로퍼티는 META-INF 폴더안에 생성됨참고 @Bean vs @Componen
참고 Filterhttps://gardeny.tistory.com/35참고 OncePerRequestFilterhttps://minkukjo.github.io/framework/2020/12/18/Spring-142/참고 Bearerhttps:
시큐리티 설정에 적용 7. SecurityConfig 베이직 인증을 제거하고 JwtAuthenticationEntryPoint 주입
엔드포인트(요청 주소) ?response(응답 데이터) ?payload(DTO) 설계 ?에러 코드들 ?HTTP 메소드 ?에러 메세지 설명 ?https://mvnrepository.com/artifact/io.springfox/springfox-boot-star
http://localhost:8080/swagger-ui/
성공적으로 가입했습니다.
서비스 명설명Amazon EC2(Elastic Compute Cloud)아마존은 하드웨어 서버를 가상화해 그 하드웨어 자원을 사용자에게 제공하고, 사용자는 그 위에 운영체제와 소프트웨어를 설치해 클라우드 서비스를 이용한다는 개념이다.Amazon S3Simple Stor
프로파일 개발(dev), 배포(prod) 추가 application-dev.properties application-prod.properties application.properties 공통적으로 사용하는 설정과 spring.profiles.active = 상황에
이 데이터들을 스프링 부트 시작시 넣을수 있도록 하자.참고https://madplay.github.io/post/run-code-on-application-startup-in-springboot
아마존 가입하기https://portal.aws.amazon.com/billing/signup아마존 무료 계정 알아보기https://aws.amazon.com/free회원 가입 방법https://securityspecialist.tistory
public access yes몇분 정도 기다림...사용가능 myDB 클릭!엔드포인트 확인 ( DB 연결시 사용 주소)보안의 default 클릭!!보안그룹 ID 클릭인바운드 규칙 편집!MySQL/Aurora, Anywhere-Ipv4 선택 저장
내컴퓨터의 MySQL 워크벤치에서Home에 새로운 접속을 + 눌러서 만듬테스트 커넥션
properties 파일 수정DB 주소를 가입한 AWS엔드포인트로 해주자.