SOSL이라는 기능에 대한 이야기가 나와서 갑작스럽게 확인해보게 됐는데

신기하게 여러 개체를 대상으로 검색할 수 있었다.

// 검색어 설정
String searchPhone = '031-666-4444';
 
// ----------------------------
// ① SOSL (전역 검색)
// ----------------------------
List<List<SObject>> soslResults = [
    FIND :searchPhone
    IN PHONE FIELDS
    RETURNING
        Contact(Id, Name, Phone),
        Account(Id, Name, Phone),
        Lead(Id, Name, Phone)
];
 
System.debug('=== [SOSL 검색 결과] ===');
for (List<SObject> resultGroup : soslResults) {
    for (SObject record : resultGroup) {
        if (record instanceof Contact) {
            Contact c = (Contact)record;
            System.debug('Contact → ' + c.Name + ' / ' + c.Phone);
        } else if (record instanceof Account) {
            Account a = (Account)record;
            System.debug('Account → ' + a.Name + ' / ' + a.Phone);
        } else if (record instanceof Lead) {
            Lead l = (Lead)record;
            System.debug('Lead → ' + l.Name + ' / ' + l.Phone);
        }
    }
}

 

이것 외에 api를 통해서 개체 지정도 없이 그냥 값으로 전체 검색을 할 수 있는데

api를 통해서 진행할정도면 그냥 일반 사용으로 검색하는게 나은 것 같다는 생각이 들어서 추가로 알아보진 않았다.

 

AWS에서 주기적 비용 청구가 되고 있는데 아래와 같이 계정 설정 우측 상단에서 계정 폐쇠를 해서 해결했다.

나중에도 뭔가 테스트할 일이 생기면 새로 생성하는 것보다는 비용이 나가는 것들을 다 막는게 편하긴 한데

언제 또 이런걸 쓸지도 모르는데 방치했다가 추가로 20달러는 넘게 더 나오고 있기 때문에

그냥 안전하게 폐쇄부터 했고 3개월 안에 복구하면 계정은 살아남는다고 하니 바로 처리해버렸다.

 

 

 

(1).백준 31922번 이 대회는 이제 제 겁니다는 1,3번 또는 2번 대회에서 우승할 수 있다고 할 때 받을 수 있는 최대 금액을 출력해야 하는 문제였다.

 

단순히 1,3번과 2번이라 둘 줄 최대치를 Math.max로 비교했는데

백준 출력 부분은 .map(Number)를 빼먹어버려서 String으로 연결되어버려서 해당 부분 수정 후 정답처리되었다.

const input = `500 300 500`.split(' ').map(Number)

console.log(Math.max(input[0] + input[2], input[1]))

'회고' 카테고리의 다른 글

[개발일지] - 834  (0) 2025.10.16
[개발일지] - 833  (0) 2025.10.15
[개발일지] - 831  (0) 2025.10.14
[개발일지] - 830(주말)  (0) 2025.10.12
[개발일지] - 829(주말)  (0) 2025.10.11

SFDC DataCloud에 AWS의 Redshift를 연결하려고 했는데

한참동안 권한 등 문제가 발생했지만 해결은 생각보다 간단했다.

일반적인 것들을 제외하고 문제가 됐던 부분은 ip 대역폭이었는데

당연히 서울 근처 지역이라고 생각하고 북동아시아 ip 대역폭을 다 열어뒀었는데

DataCloud용 Demo Org의 경우에는 CAD라는 리전이었기 때문에 캐나다쪽 ip 대역폭을 열어줘야 했고

생각보다 너무 허무하게 바로 연결되어버렸다.

이후에는 Redshift의 테이블을 SFDC에서 조작할 수 있어야 헀는데

이 부분은 갑자기 그리스 문자에서나 들어봤던 람다라는걸 써야 한다고 하는데

파이썬도 안써봤고 이상한 기능도 처음이라 다시 또 처음 redshift 등을 들어봤을 때처럼 당황스러웠다.

Salesforce(Apex) ──HTTP──▶ API Gateway ──▶ Lambda ──(Redshift Data API)──▶ Redshift (POST /updateRecord) ▲ └── UPDATE 실행, updated_at 갱신

일단 람다에 파이썬으로 코드를 생성해주고 테스트를 진행한 다음

redshift에서 정상적으로 업데이트 된 부분을 볼 수 있었지만

막상 데이터의 날짜가 이상해서 일부 수정해서

updated_at = DATEADD(hour, 9, GETDATE()) 방식으로 현재 시간이 제대로 들어가게 만들었다.

import json, os
import boto3

rsd = boto3.client('redshift-data')

WORKGROUP = os.environ['WORKGROUP']
DATABASE  = os.environ['DATABASE']
SECRET_ARN = os.environ['SECRET_ARN']

def lambda_handler(event, context):
    try:
        body = event.get('body')
        if isinstance(body, str):
            body = json.loads(body)
        elif body is None:
            body = {}

        record_id = body.get('id')
        status    = body.get('status')

        if record_id is None or status is None:
            return _res(400, {"ok": False, "error": "id and status are required"})

        # 한국 시간(UTC+9)으로 updated_at 저장
        sql = """
        UPDATE public.sfdc_test_data
           SET status = :status,
               updated_at = DATEADD(hour, 9, GETDATE())
         WHERE id = :id
        """

        resp = rsd.execute_statement(
            WorkgroupName=WORKGROUP,
            Database=DATABASE,
            SecretArn=SECRET_ARN,
            Sql=sql,
            Parameters=[
                {"name": "status", "value": str(status)},
                {"name": "id",     "value": str(record_id)}
            ]
        )

        return _res(200, {"ok": True, "statementId": resp["Id"]})
    except Exception as e:
        return _res(500, {"ok": False, "error": str(e)})

def _res(code, body):
    return {
        "statusCode": code,
        "headers": {"Content-Type": "application/json"},
        "body": json.dumps(body)
    }
{
  "body": "{\\"id\\":2, \\"status\\":\\"Active\\"}"
}

날짜 필드까지 연결하고나니 드디어 RedShift를 사용하는 목적을 볼 수 있었는데

증분 필드가 있어서 해당 필드 기준으로 레코드를 반영할 수 있는 것 같다.

 

 

일단 연결을 완료하고 이 부분은 S3와의 연결에도 가능한지 확인은 해봐야 할 것 같은데

사실 연결 자체는 S3로 하고

S3에 게이트를 Redshift로 열어준 다음 API로 업데이트 진행만 하는게 제대로 된 방식이라고 추측되긴 한다.

Remote Site Setting에 주소를 추가한 다음

아래와 같이 게이트웨이로 통신을 시도하니 정상적으로 code 200을 받을 수 있었다.

HttpRequest req = new HttpRequest();
req.setEndpoint('<https://주소값.execute-api.ap-northeast-2.amazonaws.com/prod/update>'); // 네 API Gateway URL
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');

// 변경할 레코드 ID와 상태
String body = '{"id":2, "status":"Inactive"}';
req.setBody(body);

Http http = new Http();
HTTPResponse res = http.send(req);

System.debug('Status: ' + res.getStatusCode());
System.debug('Body: ' + res.getBody());

 

이후 SFDC 연결까지는 진행했는데 증분식 업데이틍가 딜레이가 있어서 내일 추가 진행하기로 했다.

 

 

(1).백준 13580번 Andando no tempo는 앞, 뒤로 이동할 수 있는 수치 3개를 제공해줄 때

원래 자리로 돌아올 수 있는지를 묻는 문제였다.

 

최대 1번씩 사용하고 사용하지 않을 수 있기 때문에 오름차순 정렬 후 작은 것 두개가 큰 것과 같거나

같은게 있는지 a,b b,c 비교를 통해서 같은 경우 S를 출력하고 아닌 경우 N을 출력하는 방식으로 해결했다.

const [a,b,c] = `31 110 79`.split(' ').map(Number).sort((a,b) => a-b)

if(a ==b || b == c || a+b == c){
    console.log('S')
}
else{
    console.log('N')
}

'회고' 카테고리의 다른 글

[개발일지] - 773(광복절)  (0) 2025.08.15
[개발일지] - 772  (3) 2025.08.14
[개발일지] - 769  (0) 2025.08.11
[개발일지] - 768(주말)  (0) 2025.08.10
[개발일지] - 767(주말)  (0) 2025.08.09

+ Recent posts