(?.) what is this mean? (Optional Chaining)

next.js authentication 예제를 살펴보면 다음과같은 코드가 있다

{state?.errors?.email && <p>{state.errors.email}</p>}


state?.errors?.email 를 보면 각 참조(.) 중간에 ? 가 있는데 이것은 접근하려는 오브젝트나 호출하려는 함수의 참조 오류가 있을 때 오류를 발생시키지 않고 undefined 를 반환 하게하는 연산자이고 이를 옵셔널 체이닝 이라고 부른다.

if문으로 nullish 검증을 하는 코드를 줄여줄 수 있는 연산자라 편하긴 한데 오류를 내지 않고 undefined 를 반환하게되어 디버깅에 혼란을 줄것같다. UI 코드나 중요하지 않은 부분에 사용하면 좋을 것 같다.

How to solve that next.js and AWS RDS PostgreSQL connection is failed.

Problem

Next.js 를 사용한 웹앱에서 다음과 같이 AWS RDS의 PostgreSQL 인스턴스에 연결을 시도할 때 에러가 출력되면서 query가 제대로 실행되지 않는 상황이 발생했다.

// db.js
import { Pool } from 'pg';

const pool = new Pool({ 
    host: process.env.HOST,
    database: process.env.DB,
    user: process.env.USER,
    password: process.env.PASSWORD,
    port: prcoess.env.PORT,
} );

export default pool;</mark>
// api/users/route.js

import { NextResponse } from 'next/server';
import pool from 'db';

export async function GET() {
    try {
        const result = await pool.query( 'SELECT NOW()' );
        return NextResponse.json( result.rows, { status: 200 } );
    } catch (error) {
        return NextResponse.json( { error: error }, { status: 500 } );
    }
}

Error

// Error
{  
   "length":181,
   "name":"error",
   "severity":"FATAL",
   "code":"28000",
   "file":"auth.c",
   "line":"543",
   "routine":"ClientAuthentication",
   "level":"error",
   "timestamp":"..."
}

Reason

현재 나의 DB 인스턴스의 PostgreSQL 버전은 16.4 인데 버전 15 이후부터는 DB를 구성하는 파라미터 중 force_ssl이라는 인자가 0에서 1로 바뀌었다고 한다. 이 인자가 1(true) 이면 인증이 확인되지 않는 사이트로 부터 받는 요청은 거부 된다고 한다. 따라서, 문제를 해결하기 위해서는 force_ssl 파라미터 값을 0으로 바꿔주면 SSL 설치가 되지 않는 로컬 환경에서 접속이나 쿼리 요청을 할 수 있게 된다.
https://stackoverflow.com/questions/76511667/nodejs-postgresql-connection-failure

Solve

force_ssl 을 0으로 셋업한 파라미터 그룹을 내가 생성한 인스턴스에 적용해 주면 된다.

파라미터 그룹에 들어가 파라미터 그룹 생성을 눌러 생성 페이지로 들어가 준다.

생성 후 생긴 파라미터 그룹 편집에 들어가 force_ssl 을 필터링 한 후 값을 바꾸고 저장하면 된다.

생성한 파라미터 그룹을 인스턴스에 적용하면 된다. 파라미터 그룹을 수정하면 인스턴스를 재부팅 해야하기 때문에 적용하는데 시간이 좀 걸린다. 대충 20~30분 정도 걸리는듯

이렇게 하면 로컬 next.js 앱에서 쿼리 요청을 보내면 응답 받을 수 있게 된다.