no image
[JPA] 엔티티 매핑
테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리하고, 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수이다. 엔티티 클래스에는 기본 생성자가 필수이다. final 클래스 enum,interface,inner클래스는 사용할 수 없다. 저장할 필드에 final을 사용하면 안됀다. @Entity 속성 -> name :JPA에서 사용할 엔티티 이름을 지정한다. 그러나 가급적이면 기본값을 사용한다. @Table은 엔티티와 매핑할 테이블을 지정한다. name : 매핑할 테이블 이름을 지정한다. catalog : 데이터베이스 catalog 매핑 schema : 데이터베이스 schema 매핑 uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약..
2021.09.10
no image
Querydsl 오류 (querydsl error cannot find symbol)
프로젝트를 진행하는 중 빌드 과정에서 querydsl error cannot find symbol라는 에러가 발생했다. 다른 블로그 등을 참고하면서 해결하는 방법을 찾았다. build/generated파일을 프로젝트 설정에 들어가서 Sources로 변경해주면 IDE가 해당 파일을 source로 인식해서 더 이상 오류를 반환하지 않습니다. ++가끔 밑에 사진처럼 build and run using이 gradle로 되어 있으면 오류를 뱉는 경우가 있다. ++만약 이 오류를 뱉는다면 build and run using와 run tests using을 인텔리제이로 변경해주면 해결될것이다.
2021.09.02
no image
ResponseEntity
➡️ResponseEntity란? SpringFrameword에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재한다. 이것은 HTTP 요청(request) 또는 응답(response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다. 1 2 3 4 5 6 7 public class HttpEntity { private final HttpHeaders headers; @Nullable private final T body; } Colored by Color Scripter cs 1 2 3 public class RequestEntity extends HttpEntity public class ResponseEntity extends HttpEntity cs ResponseE..
2021.08.25
no image
@Transactional
일단 @Transactional 을 사용하기 전 트랜잭션에 대해 알아야 한다 트랜잭션에 대해 한번 알아보자. 👉트랜잭션(transaction) 정의 트랜잭션(transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다. 👉트랜잭션 특징 트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이다. 사용자가 시스템에 대한 서비스 요청시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다. 하나의 트랜잭션은 Commit되거나 Rollback된다. 👉트랜잭션(transaction) 성질 원자성 (Atomicity) 한 트랜잭션 내에서 실행한 작업들은 하나로 본다. 모두 성..
2021.08.24
no image
Spring REST Docs
➡️Spring Rest Docs 프로젝트를 하다 보면 같이 프로젝트를 진행하는 팀원들에세 API문서를 제공할 일이 많다.그런데 직접API를 위키나 문서에 정리하게 되면 코드와 싱크를 맞추기가 힘들다.대부분 API코드가 변경되면 문서를 잘 변경하지 않는다.이러한 문제를 해결해 주는 게 Spring REST Dosc이다. Spring REST Docs는 test code 기반으로 아래와 같이 문서를 생성해 준다.Test code 기반으로 문서가 생성되기 때문에 코드가 변경 되더라고 코드 기반으로 문서를 자동으로 업데이트하기 때문에 코드와 문서에 싱크 문제도 존재하지 않는다. 이러한 이유로 Rest docs는 API 문서로 사용하는데 아주 좋다. Build gradle 설정 하기 1.Asciidoctor p..
2021.08.23
no image
[Mac]GitHub push 오류(토큰 인증)
➡️오류 내용 remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/for more infomations. fatal: unable to access ‘https://github.com/레포리토리명/’:The requested URL returned error:403 갑자기 오류가 뜨면서 푸시가 안되는 현상을 겪어서 검색하면서 찾아 봤더니 GitHub에서 2021년..
2021.08.21
no image
[MYSQL]SQL_1
➡️SQL 기본 -SQL은 관계형 데이터 베이스에 표준 언어이다. -SQL은 기능에 따라 데이터 정의어(DDL),데이터 조작어(DML),데이터 제어어(DCL)로 나뉜다. 데이터 정의어 : 테이블이나 관계의 구조를 생성하는 데 사용하며 CREATE,ALTER,DROP 문 등이 있다. 데이터 조작어 : 테이블에 데이터를 검색,삽입,수정,삭제하는 데 사용하며 SELECT,INSERT,DELETE,UPDATE 문 등이 있다. 여기서 SELECT 문은 질의어라고 부른다. 데이터 제어어 : 데이터의 사용 권한을 관리하는 데 사용하며 GRANT,REVOKE 문 등이 있다. ➡️데이터 조작어 -검색 -SQL에서 SELETE 문은 데이터를 검색하는 기본 문장으로, 특별히 질의어라고 부른다. -SELECT 문은 검색한 결..
2021.08.21
no image
Redis란?
➡️Redis를 이해할려면 NOSQL에 대해서 알아야 한다. 👉NOSQL(Not Only SQL)이란? RDBMS를 관계형 데이터베이스라고 부르는 반면 NOSQL은 비관계형 데이터 베이스이다. 보통 NOSQL은 KEY-VALUE나 컬러,문서 형태의 데이터 모델을 이용한다. 관계형 데이터베이스가 아닌 다른 형태로 데이터를 저장하는 기술이라고 생각하면 좀 이해가 된다. 👉NOSQL을 언제 쓰는가? 아주 많은 양의 데이터를 효율적으로 처리가 필요할 때, 데이터의 분산처리, 빠른 쓰기 및 데이터의 안정성이 필요할 때 사용한다. 특정 서버에 장애가 발생했을 때에도 데이터 유실이나 서비스 중지가 없는 형태의 구조이기 때문에 사용한다. 💻Redis란? REDIS(REmote Dictionary Server)는 메모리..
2021.08.16

[JPA] 엔티티 매핑

ryudjae
|2021. 9. 10. 00:36
728x90

테이블 매핑

@Entity

  • @Entity가 붙은 클래스는 JPA가 관리하고, 엔티티라고 한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수이다.
  • 엔티티 클래스에는 기본 생성자가 필수이다.
  • final 클래스 enum,interface,inner클래스는 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안됀다.

@Entity 속성

-> name :JPA에서 사용할 엔티티 이름을 지정한다. 그러나 가급적이면 기본값을 사용한다.

 

@Table은 엔티티와 매핑할 테이블을 지정한다.

  • name : 매핑할 테이블 이름을 지정한다.
  • catalog : 데이터베이스 catalog 매핑
  • schema : 데이터베이스 schema 매핑
  • uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약 조건 생성 

데이터 베이스 스키마 자동생성 

DDL을 애플리케이션 실행 시점에 자동 생성

데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL생성

이렇게 생성된 DDL은 개발 장비에서만 사용한다.

 

데이터베이스 스키마 자동 생성 속성

hibernate.hbm2ddl.auto

  • create -> 기존 테이블 삭제 후 다시 생성 (DROP+ CREATE)
  • create-drop -> create와 같으나 종료시점에 테이블을 DROP한다.
  • update ->변경 부분만 반영
  • validate ->엔티티와 테이블이 정상 매핑되었는지만 확인 
  • none -> 사용하지 않음

자동생성 속성 crate ,create-drop,update는 운영쪽에서는 절대 사용하면 안된다.

개발초기 단계에만 create 또는 Update를 사용한다.

테스트 서버는 update 또는 Validate를 사용한다.

스테이징과 운영 서버는 Validate 또는 none을 사용한다.

 


DDL생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실제 로직에는 영향을 주지 않는다.

제약조건 추가

회원이름 필수,10자 초과 X

EX: @Collumn((nullable = false),length = 10)

 

728x90
728x90

프로젝트를 진행하는 중 빌드 과정에서 querydsl error cannot find symbol라는 에러가 발생했다. 다른 블로그 등을 참고하면서 해결하는 방법을 찾았다.

build/generated파일을 프로젝트 설정에 들어가서 Sources로 변경해주면 IDE가 해당 파일을 source로 인식해서 더 이상 오류를 반환하지 않습니다.

 

 

++가끔 밑에 사진처럼 build and run using이 gradle로 되어 있으면 오류를 뱉는 경우가 있다.

++만약 이 오류를 뱉는다면 build and run using와 run tests using을 인텔리제이로 변경해주면 해결될것이다.

728x90

ResponseEntity

ryudjae
|2021. 8. 25. 02:29
728x90

➡️ResponseEntity란?

SpringFrameword에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재한다. 이것은 HTTP 요청(request) 또는 응답(response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다.

1
2
3
4
5
6
7
public class HttpEntity<T> {
 
    private final HttpHeaders headers;
 
    @Nullable
    private final T body;
}
cs

 

1
2
3
public class RequestEntity<T> extends HttpEntity<T>
 
public class ResponseEntity<T> extends HttpEntity<T>
cs

ResponseEntity와 RequestEntity는 HttpEntity를 상속 받는다. 따라서 RepsonseEntity는 사용자의 HttpRequest에 대한 Response데이터를 포함하는 클래스이다. 그러므로 HttpStaus,HttpHeader,HttpBody를 포함한다.

ResponseEntity의 생성자를 보면 this()를 통해서 매게변수가 3개인 생성자를 호출해 결국인 아래에 보이는 매게변수가 3개인 성성자로 가게된다.

1
2
3
4
5
6
7
8
public ResponseEntity(HttpStatus status) {
    this(nullnull, status);
}
 
public ResponseEntity(@Nullable T body, HttpStatus status) {
    this(body, null, status);
}
 
cs

 

지금부터 간단한 예제로 보자

 

1
2
3
4
5
6
7
8
9
10
@RestController
public class BasicController {
 
    @GetMapping("/test")
    public ResponseEntity getUser(){
        return new ResponseEntity(HttpStatus.OK);
    }
}
 
 
cs

위처럼 컨트롤러를 작성한 뒤 포스트맨으로 요청을 해보면 상태코드가 200으로 나온다.

 

그리고 상태코드(status),헤더(header) ,응답데이터(ResponseData)를 담는 생성자도 존재한다.

1
2
3
4
5
6
7
8
9
10
public class ResponseEntity<T> extends HttpEntity<T> {
    
    public ResponseEntity(@Nullable T body, 
@Nullable MultiValueMap<StringString> headers,
  HttpStatus status) {
        super(body, headers);
        Assert.notNull(status, "HttpStatus must not be null");
        this.status = status;
    }
}
cs
     

위 생성자처럼 ResponseEntity를 이용해서 클라이언트에게 응답을 보내는 예제를 한번 해보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
public class Message {
    private Status status;
    private String message;
    private Object data;
 
    public Message() {
        this.status = Status.BAD_REQUEST;
        this.data = null;
        this.message = null;
    }
}
 
cs

상태코드,메시지,데이터를 담을 필드를 추가했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
public enum Status {
 
    OK(200"OK"),
    BAD_REQUEST(400"BAD_REQUEST"),
    NOT_FOUND(404"NOT_FOUND"),
    INTERNAL_SERER_ERROR(500"INTERNAL_SERVER_ERROR");
 
    int statusCode;
    String code;
 
    Status(int statusCode, String code) {
        this.statusCode = statusCode;
        this.code = code;
    }
}
 
cs

상태코드를 몇가지만 enum클래스로 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RestController
public class BasicController {
 
    @GetMapping("/test/{id}")
    public ResponseEntity<Message> getUser(@PathVariable Long id){
        User user = User.builder()
                .email("r213213@Test.com")
                .nickname("aa")
                .phone("00011111111")
                .build();
        Message message = new Message();
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(new MediaType("application","json", Charset.forName("UTF-8")));
 
        message.setStatus(Status.OK);
        message.setMessage("성공ㅋ");
        message.setData(user);
        return new ResponseEntity<>(message,httpHeaders,HttpStatus.OK);
    }
}
 
cs

그리고 위와 같이 Controller를 하나 만든 후에, id를 통해서 User를 가져오고 Message 클래스를 통해서 StatusCode, ResponseMessage, ResponseData를 담아서 클라이언트에게 응답을 보내는 코드이다.

아래는 컨트롤러를 작성한대로 포스트맨으로 실행해본 결과이다.

data부분은 내가 따로 만든 User클래스이고, 값도 다 안넣어서 null이 나온다. 그래서 컨트롤러에서 따로 넣은 부분만 확인이 가능하다.이런식으로 상태,메시지,데이터가 잘 응답하는것을 볼 수 있다.

 

일단 이렇게 ResponseEntity에서 기본적인 내용만 알아봤는데 이 내용을 이해할려면 RestApi를 공부를 조금이라도 한 상태에서 보면 더 이해가 잘될것이다.

아직 저도 RestApi에 대해 공부하는 중이라 잘못된 내용이 있을수도 있습니다.과감하게 피드백 주시면 감사하겠습니다.

 

 


REFERENCE

RestAPI

728x90

'Dev > Spring' 카테고리의 다른 글

[Spring] 어노테이션으로 로그인 여부 확인(Interceptor)  (0) 2021.09.21
[Spring] AOP(Aspect Oriented Programming)  (0) 2021.09.10
@Transactional  (1) 2021.08.24
Spring REST Docs  (0) 2021.08.23
DAO,DTO,Entity Class  (0) 2021.08.13

@Transactional

ryudjae
|2021. 8. 24. 04:20
728x90

일단 @Transactional 을 사용하기 전  트랜잭션에 대해 알아야 한다 트랜잭션에 대해 한번 알아보자.

 

👉트랜잭션(transaction) 정의

  • 트랜잭션(transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.

👉트랜잭션 특징

  • 트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이다.
  • 사용자가 시스템에 대한 서비스 요청시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다.
  • 하나의 트랜잭션은 Commit되거나 Rollback된다.

👉트랜잭션(transaction) 성질

  • 원자성 (Atomicity)
    • 한 트랜잭션 내에서 실행한 작업들은 하나로 본다. 모두 성공하거나 모두 실패
  • 일관성 (Consistency)
    • 트랜잭션은 일관성 있는 데이터베이스 상태를 유지한다.
  • 격리성 (lsolation)
    • 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야 한다.
  • 영속성,지속성 (Durability)
    • 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다.

 

👉트랜잭션(transaction) 연산 및 상태 

  • Commit연산
    • Commit연산은 한개의 논리적 단위에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자 에게 알려주는 연산이다.
  • Rollback연산
    • Rollback연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨트렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소하는 연산이다.
    • Rollback시에는 해당 트랜잭션을 재시작하거나 폐기한다.

 


이제 스프링에서 트랜잭션 처리를 지원하는데 그중 어노테이션 방식으로 @Transactional을 선언하여 사용하는 방법을 알아보자.

기본적인 적용방식 

이런식으로 클래스나 메서드 위에 @Transactional이 추가되면 ,이 클래스나 메서드에 트랜잭션 기능이 적용된 프록시 객체가 생성된다.

이 프록시 객체는 @Transactional이 포함된 메서드가 호출 될 경우, PlatformTransactionManager를 사용하여 트랜잭션을 시작하고 ,정상여부에 따라 Commit 또는 Rollback한다.

적용방식은 위 사진처럼 하면 된다. 

 

이제 다수의 트랜잭션이 경쟁시 발생할 수 있는 문제를 알아보자

 

  1. Dirty read
    • 트랜잭션1 이 어떠한 값을 A에서 B로 변경하고 아직 커밋하지 않은 상황에서 트랜잭션2가 같은 값을 읽는 경우 트랜잭션2는 값을 조회하면 B가 조회된다.(만약 트랜잭션1이 롤백을 하게되면 트랜잭션2는 잘못된 값을 읽은 것이다.)
    • 위 같은 상황을 트랜잭션이 완료되지 않은 상황에서 데이터에 접근을 허용할 경우 발생할 수 있는 데이터 불일치 이다.
  2. Non-Repeatable Read
    • 트랜잭션1이 A라는 값을 읽고, 이후 A는 같은 쿼리를 실행할 예정인데, 그 사이에 트랜잭션 2가 값을 B로 바꾸고 커밋해버리면 트랜잭션1이 같은 쿼리를 두번 날리는 사이 두 쿼리의 값은 달라진다.
    • 한 트랜잭션에서 같은 쿼리를 투번 실행했을 경우 발생할 수 있는 데이터 불일치이다.

 

 

위와 같은 문제들을 해결할 수 있는 속성에 대해서 알아보자.

@Transactional속성

1.lsolation(격리 수준)

  • DEFAULT
    • 기본 격리 수준
  • READ_COMMITED  
    • 트랜잭션이 커밋 된 확정 데이터만 읽기 허용(Dirty read 방지)
  • REPEATABLE_READ
    • 트랜잭션이 완료될 때까지 SELECT문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다.(Non-Repeatable read 방지)
    • 행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제가 불가능 하기때문에 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 리턴한다.
  • SERIALIZABLE
    • 트랜잭션이 완료될 때까지 SELECT문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다

 

2.readOnly(읽기 전용)

  • 트랜잭션을 읽기 전용으로 설정할 수 있다.
  • 성능을 최적화하기 위해 사용할 수도 있고 특정 트랜잭션 작업 안에서 쓰기 작업이 일어나는 것을 의도적으로 방지하기 위해 사용할 수도 있다.
  • 읽기 전용 트랜잭션이 시작된 이후 INSERT, UPDATE, DELETE 같은 쓰기 작업이 진행되면 예외가 발생한다. 
  • ex: @Transactional(readOnly = true)

3. 트랜잭션 롤백 예외(rollback-for, rollbackFor, rollbackForClassName) 

  • 선언적 트랜잭션에서는 런타임 예외가 발생하면 롤백한다.
  • 예외가 전혀 발생하지 않거나 체크 예외가 발생하면 커밋한다.   체크 예외를 커밋 대상으로 삼은 이유는 체크 예외가 예외적인 상황에서 사용되기보다는 리턴 값을 대신해서 비즈니스적인 의미를 담은 결과를 돌려주는 용도로 많이 사용되기 때문이다.
  • 스프링에서는 데이터 엑세스 기술의 예외는 런타임으로 전환돼서 던져지므로 런타임 예외만 롤백 대상으로 삼은것이다.

  • rollbackFor 속성설정
    • 예: @Transactional(rollbackFor=Exception.class)
    • 특정 예외가 발생 시 강제로 Rollback
  • noRollbackFor 속성설정
    • 예: @Transactional(noRollbackFor=Exception.class)
    • 특정 예외의 발생 시 Rollback 처리되지 않음

4.전파 옵션 (propagation)

 

  • 트랜잭션 동작 도중 다른 트랜잭션을 호출(실행)하는 상황이에 선택할 수 있는 옵션이다.
  • @Transactional의 propagation 속성을 통해 피호출 트랜잭션의 입장에서는 호출한 쪽의 트랜잭션을 그대로 사용할 수도 있고, 새롭게 트랜잭션을 생성할 수도 있다
  • REQUIRED
    •  디폴트 속성, 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성한다.
  • SUPPORTS
    •  이미 시작된 트랜잭션이 있으면 참여하고 그렇지 않으면 트랜잭션 없이 진행하게 만든다. 
  • REQUIRES_NEW
    •   부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성
  • MANDATORY
    •  REQUIRED와 비슷하게 이미 시작된 트랜잭션이 있으면 참여한다. 
    •  반면에 트랜잭션이 시작된 것이 없으면 새로 시작하는 대신 예외를 발생시킨다. 
    •  혼자서는 독립적으로 트랜잭션을 진행하면 안 되는 경우에 사용한다.
  • REQUIRES_NEW
    •  항상 새로운 트랜잭션을 시작한다.
    •  이미 진행 중인 트랜잭션이 있으면 트랜잭션을 잠시 보류시킨다.
  • NOT_SUPPORTED
    •  트랜잭션을 사용하지 않게 한다.
    •  이미 진행 중인 트랜잭션이 있으면 보류시킨다.
  • NEVER
    • 트랜잭션을 사용하지 않도록 강제한다.
    • 이미 진행 중인 트랜잭션도 존재하면 안된다 있다면 예외를 발생시킨다.
  • NESTED
    • 이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작한다.
    •  중첩 트랜잭션은 트랜잭션 안에 다시 트랜잭션을 만드는 것이다.




5.timeout속성

  • 지정한 시간 내에 해당 메소드 수행이 완료되이 않은 경우 rollback 수행. -1일 경우 no timeout(Default=-1)
  • ex) @Transactional(timeout=10)

 

 

728x90

'Dev > Spring' 카테고리의 다른 글

[Spring] AOP(Aspect Oriented Programming)  (0) 2021.09.10
ResponseEntity  (0) 2021.08.25
Spring REST Docs  (0) 2021.08.23
DAO,DTO,Entity Class  (0) 2021.08.13
@RequestMapping에 대하여  (0) 2021.07.24

Spring REST Docs

ryudjae
|2021. 8. 23. 23:39
728x90

➡️Spring Rest Docs

프로젝트를 하다 보면 같이 프로젝트를 진행하는 팀원들에세 API문서를 제공할 일이 많다.그런데 직접API를 위키나 문서에 정리하게 되면 코드와 싱크를 맞추기가 힘들다.대부분 API코드가 변경되면 문서를 잘 변경하지 않는다.이러한 문제를 해결해 주는 게 Spring REST Dosc이다.

Spring REST Docs는 test code 기반으로 아래와 같이 문서를 생성해 준다.Test code 기반으로 문서가 생성되기 때문에 코드가 변경 되더라고 코드 기반으로 문서를 자동으로 업데이트하기 때문에 코드와 문서에 싱크 문제도 존재하지 않는다.

이러한 이유로 Rest docs는 API 문서로 사용하는데 아주 좋다.

Build gradle 설정 하기

1.Asciidoctor plugin

2.asciidoctor 구성에 spring-restdocs-asciidoctor 디펜던시를 추가한다. 이건 자동적으로 내 프로젝트에서 .adoc파일들을 읽어 build/generated-snippets에  파일을 읽어 HTML문서로 export한다.

 

3.Spring mvc rlqksdp  snippets을 뽑고싶다면 해당 의존성을 추가해주면 된다.

 

4.(ext) snippets의 생성될 위치를 지정해준다.

5.(test) 테스트 테스크가 실행될때 snippets들이 생성 위치에 떨어지게 설정해준다.

6.(asciidoctor) asciidoctor 테스크를 구성 해준다.

 

bootJar

7.문서가 만들어지기전에 test가 실행되도록 의존성을 걸어준다.

8.jar 생성전에 asciidoctor 테스크가 실행되도록 설정해준다.

9.jar static 폴더에 rest docs가 HTML로 생성되면 넣어준다.

 

Spring REST Docs Test code 작성

 

유저를 생성하는 컨트롤러 코드 

 

 

controller단위 테스트와 rest docs를 생성하도록 작성한 테스트 코드이다.

-setup 메소드는 Rest docs를 작성하기 위해 테스트 코드 실행 전 실행되는 메소드로 설정한다.

RestDocumentationContextPrevider 은 MVC rest docs 를 세팅할 때 사용한다.

그리고 아래처럼 테스트 코드 내부에 field문서를 작성해준다.

 

 

src/docs/asciidoc 에 파일명.adoc을 작성한다.

 

 

ADOC 작성

test를 실행하고 나면 build 폴더 안에 Generated-snippets에 문서가 작성된다.

이런식으로 편리하게 작성된다.

728x90

'Dev > Spring' 카테고리의 다른 글

ResponseEntity  (0) 2021.08.25
@Transactional  (1) 2021.08.24
DAO,DTO,Entity Class  (0) 2021.08.13
@RequestMapping에 대하여  (0) 2021.07.24
[Spring]@RestController 와 @Controller의 차이  (0) 2021.07.18
728x90

➡️오류 내용

remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/for more infomations.
fatal: unable to access ‘https://github.com/레포리토리명/’:The requested URL returned error:403

갑자기 오류가 뜨면서 푸시가 안되는 현상을 겪어서 검색하면서 찾아 봤더니 GitHub에서 2021년 8월 13일부로 git 작업을 인증할 때 계정 암호를 허용하지 않는다고 발표했다.

명령어를 통한 git 접근 ,git을 사용하는 데스크답 애플리케이션,암호를 사용하여 git repository에 직접 엑세스하는 모든 앱/서비스 등이 영향을 받는다.

 

결론은 8월 13부터 토큰 기반 인증을 사용해야 합니다.

 

➡️해결 방법

Setting에 들어가서 

 

Developer settings를 선택하고

 

Personal access token을 선택후

 

오른쪽 상단에 Generate new token을 클릭하여

 

토큰을 만들어 준다. (저는 아마 repo정도만 쓸거 같아서 repo만 체크 했습니다. 다른게 필요하신분들은 보고 체크해주세요)

Expiration은 쉽게 토큰 유효기간이라고 보면 될꺼같다.

 

자신이 원하는 기능에 체크를 하면 오른쪽 하단에 Generate token 버튼을 눌러주면 

 

이렇게 토큰이 생성 되었다

이 토큰은 복사를 해놓아야 한다. 좀 있다 인증할 때 필요하다.

 

터미널에서 유저 정보를 입력한다.

1
2
3
$ git config --global user.name "username" 
$ git config --global user.email "email@email.com"
 
cs

User는 본인 깃헙이름을 치고 email에는 깃헙에 등록된 이메일을 입력해야한다.

(만약 다른 이메일을 입력하면 잔디심기가 안된다.)

 

git commit 후 push를 하게되면

1
2
3
4
$ Username for https://github.com :
$ Password for https://github.com/ryudongjae:
 
 
cs

이렇게 화면이 나올것이다 .

Username에는 자신의 아이디를 적고 Password  부분에는 아까 만들었던 Personal access token을 붙여넣기 해서 작성해준다.

 

그러면 정상적으로 Push가 될 것이다.

 

 

728x90

'Dev > Git' 카테고리의 다른 글

[GIT] git-flow 전략  (0) 2021.11.14

[MYSQL]SQL_1

ryudjae
|2021. 8. 21. 00:14
728x90

 

➡️SQL 기본

-SQL은 관계형 데이터 베이스에 표준 언어이다.

-SQL은 기능에 따라 데이터 정의어(DDL),데이터 조작어(DML),데이터 제어어(DCL)로 나뉜다.

  • 데이터 정의어 : 테이블이나 관계의 구조를 생성하는 데 사용하며 CREATE,ALTER,DROP 문 등이 있다.
  • 데이터 조작어 : 테이블에 데이터를 검색,삽입,수정,삭제하는 데 사용하며 SELECT,INSERT,DELETE,UPDATE 문 등이 있다. 여기서 SELECT 문은 질의어라고 부른다.
  • 데이터 제어어 : 데이터의 사용 권한을 관리하는 데 사용하며 GRANT,REVOKE 문 등이 있다.

 

➡️데이터 조작어 -검색

-SQL에서 SELETE 문은 데이터를 검색하는 기본 문장으로, 특별히 질의어라고 부른다.

-SELECT 문은 검색한 결과를 테이블 형태로 출력한다.

-SELECT 문의 문장 프레임 워크는 다음과 같다.

SELECT : 질의 결과 추출되는 속성 리스트를 열거한다.
FROM : 질의에 어느 테이블이 사용되는지 열거한다.

WHERE : 질의의 조건을 작성한다.

-예로 다음과 같이 작성할 수 있다.(ex_ "10000원 이상인 도서의 이름과 출판사를 보이시오.")

SELECT bookname,publisher (속성 이름)

FROM Book                               (테이블 이름)

WHERE price >= 10000;         (검색 조건)

 

SELECT 문의 기본 문법은 다음과 같다.

SELECT [ALL | DISTINCT]속성이름(들)
FROM      테이블이름
WHERE     검색조건(들)
GROUP BY     속성이름
HAVING       검색조건(들)
ORDER BY      속성이름[ASC | DESC]

SELECT와 FROM을 제외하고 나머지 문법들은 선택적으로 사용할 수 있다.
| : 는 선택 가능한 문법들 중 한 개를 사용할 수 있다.

예제에 사용할 테이블 3개

👉WHERE

(ex_ "가격이 10000원 이상 20000원 이하인 도서를 검색하세요.")
SELECT * 

FROM Book
WHERE price >= 10000 AND price <= 20000

;



(ex_ "출판사가 '굿스포츠' 혹은 '대한미디어'인 도서를 검색하세요.")
SELECT * 
FROM Book
WHERE publisher IN('굿스포츠','대한미디어')





(ex_ "도서이름에 '축구'가  포함된 출판사를 검색하세요.")
SELECT bookname,publisher
FROM Book
WHERE bookname LIKE '%축구%';



👉ORDER BY

(ex_ "도서를 가격순으로 검색하고, 가격이 같으면 이름순으로 검색하세요.")
SELECT *
FROM Book
ORDER BY price,bookname;




(ex_ "도서의 가격을 내림차순으로 검색하고, 만약 가격이 같다면 출판사의 오름차순으로 출력하세요.")

SELECT *
FROM Book
ORDER BY price DESC,publisher ASC;  (DESC: 내림차순 ASC: 오름차순)

👉GROUP BY (+집계 함수)

(ex_ "고객이 주문한 도서의 총 판매액을 구하시오")
SELECT SUM(saleprice) AS 총매출              ||(AS: 의미있는 열 이름을 출력하려고 할때 별칭을 사용한다.)
FROM  Orders;


(ex_ "2번 김연아 고객의 주문한 도서의 총 판매액을 구하시오")

SELECT SUM(saleprice) 
FROM  Orders
WHERE custid =2;


(ex_ "고객별로 주문한 도서의 총 수량과 총 판매액을 구하시오.")
SELECT custid,COUNT(*),SUM(saleprice)
FROM Orders
GROUP BY custid;


👉HAVING (+ HAVING 절은  GROUP BY절의 결과 나타나는 그룹을 제어하는 역할을 한다.)

(ex_"가격이 8000원이상인 도서를 구매한 고객에 대하여 고객별로 주문 도서의 총 수량을 수하시오. 단 , 두권 이상 구매한 고객만 구하시오")
SELECT custid,COUNT(*)
FROM  Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING count(*) >=2 ; 

 

➕두 개 이상 테이블에서 SQL 질의 ➕

(ex_"고객별로 주문한 모든 도서의 총 판매액을 구하고 ,고객별로 정렬하세요.")
SELECT name,SUM(saleprice)
FROM Customer,Orders
WHERE Customer.custid=Orders.custid
GROUP BY Customer.name
ORDER BY Customer.name;


(ex_"고객의 이름과 고객이 주문한 도서의 이름을 구하시오.")

SELECT Customer.name,Book.bookname
FROM Customer,Orders,Book
WHERE Customer.custid = Orders.custid AND Orders.bookid = Book.bookid;


(ex_"가격이 20000원인 도서를 주문한 고객의 이름과 도서의 이름을 구하시오.")

SELECT Customer.name, Book.bookname
FROM Customer,Orders,Book
WHERE Customer.custid=Orders.custid AND Orders.bookid=Book.bookid AND Book.price=20000;


(ex_"가장 비싼 도서의 이름을 보이시오.")

SELECT bookname
FROM Book
WHERE price = (SELECT MAX(price)FROM Book);


(ex_"도서를 구매한 적이 있는 고객의 이름을 검색하세요.")

SELECT name
FROM Customer
WHERE custid IN(SELECT custid
                               FROM Orders);


(ex_"대한민국에서 거주하는 고객의 이름과 도서의 주문한 고객의 이름을 보이시오.")

SELECT name 
FROM Customer 
WHERE address LIKE"%대한민국%"
UNION
SELECT name
FROM Customer
WHERE custid IN(SELECT custid FROM Orders);


 

728x90

'Dev > Database' 카테고리의 다른 글

[DB]이상현상(Anomly), 함수 종속성 (Functional Dependency)  (0) 2021.09.13
[DB] 정규화(Normalization)  (0) 2021.09.11
Redis란?  (1) 2021.08.16
데이터 베이스 시스템 개념  (0) 2021.07.20
DBMS란 무엇인가  (0) 2021.07.11

Redis란?

ryudjae
|2021. 8. 16. 02:06
728x90

 

 

➡️Redis를 이해할려면 NOSQL에 대해서 알아야 한다. 

👉NOSQL(Not  Only SQL)이란?

  • RDBMS를 관계형 데이터베이스라고 부르는 반면 NOSQL은 비관계형 데이터 베이스이다.
  • 보통 NOSQL은 KEY-VALUE나 컬러,문서 형태의 데이터 모델을 이용한다.
  • 관계형 데이터베이스가 아닌 다른 형태로 데이터를 저장하는 기술이라고 생각하면 좀 이해가 된다.

👉NOSQL을 언제 쓰는가?

아주 많은 양의 데이터를 효율적으로 처리가 필요할 때, 데이터의 분산처리, 빠른 쓰기 및 데이터의 안정성이 필요할 때 사용한다.

특정 서버에 장애가 발생했을 때에도 데이터 유실이나 서비스 중지가 없는 형태의 구조이기 때문에 사용한다.

 

💻Redis란?

  • REDIS(REmote Dictionary Server)는 메모리 기반의 “키-값” 구조 데이터 관리 시스템이며, 모든 데이터를 메모리에 저장하고 조회하기에 빠른 Read, Write 속도를 보장하는 비 관계형 데이터베이스이다.
  • 레디스는 크게 5가지< String, Set, Sorted Set, Hash, List >의 데이터 형식을 지원한다.
  • Redis는 빠른 오픈 소스 인 메모리 키-값 데이터 구조 스토어이며, 다양한 인 메모리 데이터 구조 집합을 제공하므로 사용자 정의 애플리케이션을 손쉽게 생성할 수 있다.
  • 아래 그림은 레디스 구조를 이미지화 한 것이다.

https://bcho.tistory.com/654

 

💻Redis특징

  • 영속성을 지원하는 인메모리 데이터 저장소이다.
  • 읽기 성능 증대를 위한 서버 측 복제를 지원한다.
    • Redis가 실행중인 서버가 충돌하는 경우 장애 조치 처리와 함께 더 높은 읽기 성능을 지원하기 위해 슬레이브가 마스터에 연결하고 전체 데이터베이스의 초기 복사본을 받는 마스터 / 슬레이브 복제를 지원한다. 마스터에서 쓰기가 수행되면 슬레이브 데이터 세트를 실시간으로 업데이트하기 위해 연결된 모든 슬레이브로 전송된다.
  • 쓰기 성능 증대를 위한 클라이언트 측 샤딩을 지원한다.
  • String, Set, Sorted Set, Hash, List와 같은 다양한 데이터형식을 지원한다.

💻Redis장점 

  • 리스트,배열과 같은 데이터를 처리하는데 용이하다.
    • Value값으로 String,List,Set,Set Sorted,Hash등 여러 데이터 형식을 지원하기에 , 다양한 방식으로 데이터를 활용 할 수 있다.
  • 리스트형 데이터 입력과 삭제가 NOSQL에 비해서 10배정도 빠르다.
    • 여러 프로세스에서 동시에 같은 키값에 대한 갱신을 요청할 경우,Atomic처리로 데이터 부정합 방지 Atomic처리 함수를 제공한다.
  • 메모리를 활용하면서 영속적인 데이터 보존이 가능하다.
    • 명령어로 명시적으로 삭제,expires를 설정하지 않으면 데이터가 삭제되지 않는다.
    • 스냅샷 기능을 제공하여 메모리 내용을 .rdb파일로 저장하여 해당시점으로 복구 할 수 있다.
  • Redis Server는 1개의 싱글 스레드로 수행되며, 따라서 서버 하나에 여러개의 서버로 띄우는 것이 가능하다.

 

728x90

'Dev > Database' 카테고리의 다른 글

[DB]이상현상(Anomly), 함수 종속성 (Functional Dependency)  (0) 2021.09.13
[DB] 정규화(Normalization)  (0) 2021.09.11
[MYSQL]SQL_1  (0) 2021.08.21
데이터 베이스 시스템 개념  (0) 2021.07.20
DBMS란 무엇인가  (0) 2021.07.11