본문 바로가기

Backend/PostgreSQL and TypeORM

(17)
nullable 에러 해결 -> ValueTransformer @Column({ nullable: true, transformer: new BcryptTransformer() }) ci: string; 위의 코드의 nullable에서 아래와 같은 에러가 계속 발생하였다. 왜일까? 내가 만든 BcryptTransformer에서 Partial로 ValueTransformer을 implements해서 사용하고 있어서 ValueTransformer 내부에 구현되어있던 from, to 메소드에서 to 메소드만 쓰고 싶었기에 Partial type 사용을 했었다. 근데 nullable에서 에러가 났다. 알고보니 Partial Type으로 ValueTransformer을 사용하더라도 그 안에 있는 형식은 맞춰서 써줘야 한다는 것이다. 그래서 from 메소드를 형식적으로 구현해주..
zero-length delimited identifier at or near ''" db 테이블에 id 컬럼에서 default 옵션으로 seq(시퀀스)를 설정해주는 부분이 있었는데, 계속해서 ('테이블 이름_id_seq'::regclass)를 설정하려고 하면 테이블 이름_id_seq 부분에서 빨간색으로 뜨며 인식이 되지 않으며 에러 메시지는 zero-length delimited identifier at or near ''"와 같은 에러가 뜨는 것이다. 이에 대해 알고보니, 내가 시퀀스를 만들어주지 않아서 발생하는 에러였다. 시퀀스 만드는 방법은 다음과 같다. 1) 해당 테이블의 DDL 접속 2) id 부분에서 serial 추가 id serial constraint project_activity_pk primary key, 3) 그러면 Default Expression에서 nextva..
QueryFailedError: relation DB이름 does not exist api를 실행하던 중에 ERROR [LoggingInterceptor] QueryFailedError: relation "champion-admin" does not exist 라는 에러가 발생하였다.  처음에는 relation이 존재하지 않는다? 나 이 테이블에 relation 설정한 적 없는데 하며 의아하던 중 다음과 같은 점들을 발견할 수 있었다. 1) PostgreSQL에 테이블만 만들어놓고 안에 컬럼이 없음 2) entity.ts 파일에서 @Entity('champion-admin')으로 되어있었고, table 이름은 championship_admin으로 되어있었음. 그래서 각각에 대해 1) 테이블 안에 컬럼 추가 2) entity.ts 파일 -> @Entity('champion_admin')..
SQL 쿼리문이 Run 실행환경에서 안나올때 쿼리빌더를 작성했는데 쿼리문이 (select,where절 등) Run 실행환경에 찍혀나오지 않는 현상이 있었다. 이럴 경우 postgres.config.ts 파일에서 logging 부분을 true로 바꿔주면 SQL 쿼리문이 잘 실행된다.
엔티티와 SQL문의 관계 엔티티가 바뀔때마다 SQL문도 함께 업데이트를 해줘야 하는가?에 대한 이야기가 나왔다. 기존에는 엔티티 내에서 직접적으로 데이터를 추가/삭제/수정 해주었고 해당 엔티티에 대한 SQL은 따로 사용하지 않았었다. 그렇다면 엔티티 + SQL 조합으로 사용할 때, 엔티티가 바뀔때마다 SQL문은 업데이트 해도 되지 않는가?에 대한 질문이 나왔었다. 답은, 엔티티가 업데이트 될 때 SQL도 같이 업데이트를 해주는게 좋다는 것이었다. 예를 들면, 해당 엔티티에서 안쓰는 컬럼들이 너무 많을 경우 SQL로 관리하면 엔티티의 의미가 더욱 명확해진다는 것이다. 또한 테이블의 더미데이터도 SQL로 작성하면 쉽게 DB를 날릴때도 유용하다는 것. 아직 익숙하지는 않지만, 천천히 시도해보려고 한다.
FindOneOptions 안의 where 그리고 relations 단건조회 API를 작성을 했는데, 전체 조회할때 나왔던 릴레이션 관계가 나오지 않았었다. 알고보니 내가 단건조회 시 릴레이션을 잡지 않았던 것이다. 단건조회의 경우 FindOneOptions를 통해 where절을 id로 조회하는 것을 넣었었는데, 전체조회 시 적용했던 릴레이션이 없었기 때문에 릴레이션을 적용한 부분이 나오지 않았었다. 수정 전 async getOne(id:number): Promise { const options: FindOneOptions = { where: {id}, }; return this.memberRepsository.findOne(options); } 수정 후 async getOne(id:number): Promise { const options: FindOneOptions ..
회원가입때 받을 개인정보 컬럼이 달라질 것을 고려하기 위해 jsonb 사용한다? 다른 다오가 생길때 회원가입시 받아야 하는 정보가 늘어나면 컬럼도 늘어나기 마련. 그래서 jsonb로 유동적으로 받게 한다고 한다. jsonb는 그 자체로 유연한 스키마를 가지고 있다. { "age": 30, "department": "HR" } { "age":30, "department" : "HR", "location" : "NY" } jsonb 컬럼을 사용하면 이전 속성에 영향을 받지 않고 새로운 컬럼을 추가하거나 기존 속성 수정 가능 -> 다양한 프로젝트 간에 일관된 데이터를 유지하고자 할 때 유용하다. BUT 데이터의 일관성과 유지를 위해 비즈니스 로직에서 신경쓸 부분이 있다고 한다. (검증 및 처리 로직)
JSONB 타입이 column에 존재한다 PostgreSQL 9.4부터 JSONB 타입이 추가되었다고 한다. (2014년경) JSON JSONB 입력받은 텍스트값을 DB에 그대로 저장한다. 그대로 저장 X JSONB와 반대 문자열 사이의 공백도 제거 + KEY 순서 보장 X JSONB와 반대 JSONB가 JSON보다 좀 더 많은 디스크를 사용한다(Always는 아님) Indexing 불가능 Indexing 가능 ※ 특별한 사유가 없으면 JSONB를 사용하라고 하는데 아직은 잘 와닿지 않는다 ㅜ Data Insert시 JSON > JSONB Data 처리 JSON < JSONB (바이너리 형태) 예를 들어 member 라는 테이블이 존재할때 JSONB로 정의된 'signup_info'라는 컬럼이 있다고 하자. JSONB 타입에 JSON을 보통 다..
relation 그리고 연관관계 잡기 내가 현재 기준점을 잡은 entity의 이름을 A라고 하자. A와 B entity는 서로 일대일 관계이고, B와 C는 일대다 관계였다. 이런 상황에서 A->C로 바로 참조할 수 있는 방법이 있나?라고 고민하던 중에 내가 처음으로 시도하던 방법은 relation에 2개의 테이블 이름을 넣는 것이었다. const result = await this.memberRepository.find({ relations: ['B','C'], }); 결과값이 원하는 대로 나오긴 했지만, 이는 올바른 방법이 아니다. 왜일까? 만약 A에서 중구난방으로 떨어진 테이블을 참조하려고 하면 그 관계가 끝도 없이 파야 나올텐데, 내가 했던 방법은 올바르지 않은 것이다. 이럴 때에는 참조하는 테이블을 잘 명시해주어야 한다. 수정한 내용..
fidOne()과 FindOneOptions 객체 기존 코드 async getOne(id: number): Promise { return this.memberRepository.findOne(id); // id만 전달 } findOne(id)로 했었는데 아래와 같은 에러가 발생하였다. Argument type number is not assignable to parameter type FindOneOptions id가 들어가는 인자부분에서 에러가 난 것이었다. 이를 해결하기 위해 일단 체크해야 할 점 - findOne() 함수에 전달되는 파라미터는 검색할 레코드의 식별자(ex. primary key)이다. 숫자 혹은 문자열과 같은 식별자를 전달하면 해당 레코드를 찾아 반환한다. member db에서 id가 PK로 잡혀있었기에 뭐가 문제지?싶었다. 사용해..