쿼리 dsl 경로 설정 부분을 변경하니 해결되었다.

// QueryDSL
idea {
   module {
      val kaptMain = file("$buildDir/generated/querydsl")
      sourceDirs.add(kaptMain)
      generatedSourceDirs.add(kaptMain)
   }
}

기존 경로

"build/generated/source/kapt/main"

변경한 경로

"$buildDir/generated/querydsl"

 

Spring boot 2.6버전 이후에 spring.mvc.pathmatch.matching-strategy 값이 ant_apth_matcher에서 path_pattern_parser로 변경되면서 swagger를 포함한 몇몇 라이브러리를 사용할 때 오류가 발생한다고한다. 

application.yml 에 아래 설정을 추가하면 오류가 발생 하지 않는다.

 

spring:

  mvc:

    pathmatch:

      matching-strategy: ant_path_matcher

 

 

https://www.inflearn.com/questions/230160

 

swagger 연동을 할려고 하는데 에러가 발생합니다 - 인프런 | 질문 & 답변

지금 현재 swagger 해보고 있는데  org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exc...

www.inflearn.com

 

Internet gateway(IGW)

 - 인터넷으로 나가는 통로이다. 스타크래프트의 게이트웨이를 통해 외계에서 질럿이 소환되는 것과 비슷한 원리이다.

 - Private subnet은 IGW로 연결되어 있지 않다.

 

Route table

  - 트래픽이 어디로 가야 할지 알려주는 테이블

  - VPC 생성 시 자동으로 만들어줌

 

NACL(Network Access Control List)/Security Group

  - 보안 검문소

  - NACL -> Stateless, SG -> Stateful

  - Access Block은 NACL에서만 가능

  

NAT(Network Address Translation) instance/gateway

  - Private VPC subnet 인터넷 게이트웨이 밖으로 연결되기 위해서 사용된다.

  - Public Subnet을 거처서 Private 으로 연결된다.

  - NAT instance는 ec2를 사용해서 구현된다.

  - Net instance/ Net Gateway는 Public Subnet에 있어야 한다.

 

Bastion host

  - 인터넷에서 private subnet에 접근하기 위해서 사용된다.

  - Public subnet 내에 위치하는 EC2

 

VPC endpoint

  - 서비스에 비공개로 연결, 퍼블릭 IP 주소를 필요로 하지 않는다.

  - Aws의 여러 서비스들과 VPC를 연결시켜주는 중간 매개체

  - Route Table을 통해 외부로 나가지못하는 Private VPC Subnt을 위해서 밖에 몰래 나가도록 도와준다.

 

 

 

이번에 Entity를 만들면서 Enum class를 사용하였다. QNA라는 클래스인데, 질문의 답변과 질문을 저장하는 테이블이다. 해당 질문에 답변이 되었는지 구별하기 위해서 isAnswered라는 변수를 만들었다. 해당 변수는 Enum 타입이다. 별생각 없이 Enum class를 변수로 두고 Entity를 생성하였다. 테이블의 enumtype에 들어간 값을 보니 순번이 들어가 있었다. 순번이 들어가 있으면 해당 순서에 있는 문자열을 확인해야 무슨 의미인지 확인할 수 있고 순서가 변경되었을 때 테이블에는 변경된 순서를 반영할 수 없는 문제가 있다. 이를 해결하기 위해서 @Enumerated 어노테이션이 필요하다.


@Enumerated 어노테이션의 타입은 2가지가 있다. ORDINAL, STRING이다. ORDINAL은 한국말로 순서를 나타내는 숫자 서수라고한다. ORDINAL을 사용할 경우 그냥 어노테이션을 사용하지 않아도 같은 효과를 볼 수 있기 때문에 해당 어노테이션을 사용했다면 목적은 STRING 타입을 사용하여 서수 대신에 해당 타입의 이름이 들어가게 하는 것이다. STRING 타입으로 설정하면 순번이 테이블에 기록되는 것이 아니라 ENUMTYPE의 이름이 저장되게 된다. 참고로 순서가 저장되게 되면 해당 칼럼은 INTEGER 타입이 된다.

 

 

EnumType 예시

public enum EnumType {
    /** Persist enumerated type property or field as an integer. */
    ORDINAL,

    /** Persist enumerated type property or field as a string. */
    STRING
}

 

 

ENTITY에서 사용 예시 by kotlin

    @Enumerated(EnumType.STRING)
    var isAnswered = AnswerType.NOT_ANSWERED
        protected set

 

 

오류 invalid source release: 11


 

 

오류의 원인


프로젝트 JDK 버전은 11로 설정 되어있지만 세팅이 JDK 8로 설정 되어있기 때문이다.

 

해결책


Settings > Build, Exception, Deployment > Build Tools > Gradle

 

 

클라이언트에서 서버로 &, + 등의 특수 문자를 보낼 때 발견되었다.

 

오류를 위한 해결책


encodeURIComponent() 

서버로 데이터를 보내기전 해당 데이터를 encodeURlComponent()로 감싸서 서버에게 보내면 성공적으로 특수문자(&,+)을 사용할 수 있었다.

 

encodeURIComponent() 


URL의 특정한 문자를 UTF-8로 인코딩하여 하나, 둘, 셋, 혹은 네 개의 연속된 이스케이프 문자로 나타낸다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

 

 

encodeURIComponent() - JavaScript | MDN

encodeURIComponent() 함수는 URI의 특정한 문자를 UTF-8로 인코딩해 하나, 둘, 셋, 혹은 네 개의 연속된 이스케이프 문자로 나타냅니다. (두 개의 대리 문자로 이루어진 문자만 이스케이프 문자 네 개로

developer.mozilla.org

 

크롬 드라이버의 find_element_by_css_selector 를 통해서 element를 python으로 가져와서 사용할 수 있다.

 

카카오맵 엘레먼트 찾기

  1. 원하는 엘레먼트를 찾은 후 우클릭하여 검사한다.
  2. 해당 엘레먼트를 검사 창에서 다시 우클릭한 후 Copy > Copy selector 를 선택한다.
  3. 해당 값을 find_element_by_css_selector 의 매게변수로 전달한다.

 

외래 키를 설정하려면 Collation 값이 일치해야 한다.

 

Collation 값 확인하는 방법

show full columns from article ;

 

아래와 같은 방법으로 Collation 값을 변경한다.

alter table category convert to character set utf8 collate utf8mb3_general_ci;

 

 

SQL Error [1452] [23000]: (conn=3205) Cannot add or update a child row: a foreign key constraint fails 

 

Collation 값을 일치시켜준 후 외래 키를 생성하려고 하니 위와같은 오류를 만나게 되었다.

위 오류는 외래키를 생성하려는 테이블에서 외래키를 만들려는 값에 참조 테이블에 없는 값을 가지고 있기 때문이다.

 

travis-ci를 더이상 무료로 사용할 수 없기에 수동으로 제배포 하기로 했다.

우선 프로젝트가 8080포트를 사용하기에 8080포트를 사용중인 프로젝트를 죽인다.

 

8080포트 사용중인 프로세스 종료 시키기

lsof -i tcp:8080
kill $(lsof -t -i:8080)

 

8080포트를 사용중인 프로젝트를 죽였다면 

프로젝트 경로로 이동후 프로젝트 제거

프로젝트 폴더와 해당 내부의 파일을 동시에 제거하기 위한 명령어는 아래와 같다

rm -rf 폴더이름

일반적으로 rm만으로는 폴더에 프로젝트가 존재하면 제거할 수 없다.

빈 폴더면 rmdir로 제거하면 된다.

깃 클론을 이용해서 다시 프로젝트를 받는다.

 

gradlew를 사용하기 위해서 권한 설정을 한다.

chmod +x ./gradlew

 

다음으로 테스트를 수행한다.

./gradlew test

 

다 되었으면 작성해둔 deploy.sh를 실행시킨다.

./deploy.sh

<맞는 코드>

List<Article> findTop4ByCategoryNotOrderByViewCountDesc(String category);

 

<틀린 코드>

List<Article> findTop4ByCategoryNotAndOrderByViewCountDesc(String category);

ORDERBY중간에 AND를 사용하면 안 된다.

ORDERBY의 경우 WHERE 절의 조건이 아님으로 AND를 사용할 필요 없다.

나의 경우 ORDERBY 앞에 AND로 연결하고 조금 헤매게 되었다.

+ Recent posts