본 포스트에서는 개체(오브젝트)의 생성 및 사용 방법에 대해 설명하겠습니다.

영어, 일본어 에서는 다 오브젝트라 하는데 왜 한글판은 개체라고 되어있는건지...

 

일단 한글판으로 포스팅하고 있기 때문에, "개체"로 통일하겠습니다.


# 목차

  • Salesforce에서의 개체(오브젝트)란?

  • 개체 생성 방법

  • 개발자 콘솔에서의 데이터 검색, 생성, 삭제, 수정

  • Apex를 통한 데이터 검색, 생성, 삭제


# Salesforce에서의 개체(오브젝트)란?

 

Salesforce에서 "개체"일반적으로 API 오브젝트는 조직의 정보가 들어있는 데이터베이스 테이블을 나타냅니다.

그리고, "레코드"는 데이터베이스의 행(필드) 를 나타냅니다.

"레코드""사용자 정의 필드(커스텀 오브젝트)" 라고도 불립니다.

 

  개체(오브젝트) = 테이블

  레코드 = 행

 

또한, Salesforce에서 이미 생성되어 있는 개체를 "표준 개체",
유저가 직접 만든 개체를 "사용자 정의 개체(커스텀 오브젝트)" 라고합니다.


# Salesforce에서의 개체(오브젝트)란?

 

개체를 생성하기 위해선, [설정 -> 빌드 -> 만들기 -> 개체]를 선택해 "사용자 정의 개체" 화면으로 이동합니다.

 

"사용자 정의 개체" 화면을 표시한 뒤, [새 사용자 정의 개체] 버튼을 눌러 "새 사용자 정의 개체" 화면을 표시합니다.

 

"새 사용자 정의 개체" 화면에서 입력 항목을 입력한 후, [저장] 버튼을 눌러줍니다.

 ※ 여러개의 개체를 생성할 예정이라면, [저장 및 새로 만들기] 버튼을 눌러 저장과 동시에 새로운 개체 생성 화면을 표시할 수 있습니다.

 

  • 레이블 : 개체 화면에서 개체 리스트에 표시될 개체의 명칭

  • 개체 이름 : 개체의 API 참조명

  • 상세 설명 : 개체에 대한 설명 기입란(생략 가능)

  • 레코드 이름 : 개체의 레코드 이름(표준 항목)

  • 데이터 유형 : 개체의 레코드 이름의 데이터 타입

본 포스트에서는 다음과 같은 개체를 생성하겠습니다.

 

☞ 입력 정보

  레이블 : 게임

  개체 이름 : Game

  레코드 이름 : 게임 타이틀

  데이터 유형 : 텍스트

  나머지 : 디폴트 설정 그대로

 

"게임" 이라는 개체를 만들었으니, 실제로 사용할 레코드를 만들어줍시다.

 

본 개체에서는 "장르", "출시일", "제작사명" 필드를 추가로 생성하고, 게임 명은 표준 필드에 있는 "게임 이름"을 사용하겠습니다.

 ※ 표준 필드에 있는 레코드는 추가, 삭제가 불가능합니다.

"사용자 정의 필드& 관계" 섹션에서 [새로 만들기] 버튼을 눌러 "새 사용자 정의 필드" 화면을 표시합니다.

 

첫번째로 선택할 것은 레코드의 데이터 타입입니다.

 

레코드의 데이터 타입은 다음과 같습니다.

데이터 타입 설명
롤업 요약 "누적 집계"라고도 불리며, 주종 관계에서 자식 개체의 특정 항목을 지정하여 데이터의 최대값, 최소값, 합계 등 과 같은 집계 정보를 자동 설정 하는 데이터 타입
수식 직접 지정한 수식을 계산하여 자동 설정 하는 데이터 타입
자동 번호 레코드가 등록 될 때 마다 지정된 형식으로 1씩 증가하는 데이터 타입
예) {0000} 로 설정하면 등록되는 레코드마다 0001, 0002, ... 로 자동 증가
마스터-세부 사항 관계 데이터베이스의 주종 관계와 동일
외부 조회 관계 부모가 외부 개체인 경우에 사용
조회 관계 다른 개체를 참조하기 위한 데이터 타입, 관계 필드를 통해 다른 개체의 레코드를 참조 가능
URL 웹 사이트의 주소 입력이 가능한 데이터 타입, 지정된 URL이 별도의 브라우저 창에 표시
긴 텍스트 영역 긴 문자열을 저장할 때 사용되는 데이터 타입, 최대 131,072자 까지 입력 가능
날짜 날짜를 저장하기 위한 데이터 타입 (yyyy/MM/dd)
날짜/시간 날짜와 시간을 저장하기 위한 데이터 타입 (yyyy/MM/dd HH:mm:ss)
백분율 백분율 숫자를 입력하면 자동으로 백분율 기호가 추가되는 데이터 타입
텍스트 영역(서식 있는 텍스트) 서식이 있는 긴 문자열, 이미지, 링크 등이 입력 가능한 데이터 타입, 최대 131,072자 까지 입력 가능
선택 목록 사용자가 정의한 리스트에서 값을 선택할 수 있는 데이터 타입
선택 목록(다중 선택) 사용자가 정의한 리스트에서 여러개의 값을 선택할 수 있는 데이터 타입
숫자 숫자를 저장하기 위한 데이터 타입
시간 시간을 저장하기 위한 데이터 타입 (HH:mm:ss)
이메일 이메일 주소를 저장하기 위한 데이터 타입
전화 전화번호를 저장하기 위한 데이터 타입
지리적 위치 위치를 저장하기 위한 데이터 타입
텍스트 문자열을 저장하기 위한 데이터 타입, 최대 255자 까지 입력 가능
텍스트(암호화됨) 문자열을 암호화된 형식으로 저장할 수 있는 데이터 타입
텍스트 영역 여러 줄에 걸쳐 문자열을 입력할 수 있는 데이터 타입, 최대 255자 까지 입력 가능
통화 금액을 저장하기 위한 데이터 타입, 통화를 자동으로 형식화 할 수 있음
확인란 Boolean 타입의 정보를 저장하기 위한 데이터 타입, TRUE, FALSE 입력 가능

 

추가할 필드 "장르", "출시일", "제작 회사"의 데이터 타입을 각각 다음과 같이 선택한 후, [다음]버튼을 눌러줍니다.

 

선택할 데이터 타입

  • 장르 : 선택 목록

  • 출시일 : 날짜

  • 제작 회사 : 텍스트

먼저 "장르"를 추가하겠습니다. "선택 목록"을 선택한 후, [다음]버튼을 눌러 "2단계 세부사항 입력" 화면을 표시합니다.

 

그 후, 아래와 같이 입력한 후, [다음]버튼을 눌러줍니다.

 

"3단계 필드 수준 보안 설정" 에서는 작성 중인 개체를 사용할 수 있는 프로필 권한을 설정합니다.

현재 단계에서는 아무 것도 설정하지 않고 [다음] 으로 넘어가겠습니다.

 

"4단계 페이지 레이아웃에 추가"에서는 해당 개체에서 사용할 레이아웃을 추가할지에 대한 여부를 설정합니다.

현재 단계에서는 아무 것도 설정하지 않고 [저장 및 새로 만들기] 버튼을 눌러 다음 필드를 작성합니다.

 

다음으로 "출시일"을 추가하겠습니다. "날짜"를 선택한 후, [다음]버튼을 눌러 "2단계 세부사항 입력" 화면을 표시합니다.

 

그 후, 아래와 같이 입력한 후, [다음]버튼을 눌러줍니다.

 

"3단계 필드 수준 보안 설정""4단계 페이지 레이아웃에 추가"는 이전과 같이 넘어가겠습니다.

 

다음으로 "제작 회사"를 추가하겠습니다. "텍스트"를 선택한 후, [다음]버튼을 눌러 "2단계 세부사항 입력" 화면을 표시합니다.

 

그 후, 아래와 같이 입력한 후, [다음]버튼을 눌러줍니다.

"3단계 필드 수준 보안 설정" "4단계 페이지 레이아웃에 추가"는 이전과 같이 넘어가겠습니다.

 

필드의 생성이 끝났습니다.

개체 화면으로 이동하면 아래와 같이 "사용자 정의 필드& 관계"가 아래와 같이 표시됩니다.


# 개발자 콘솔에서의 데이터 검색, 생성, 삭제, 수정

 

개발자 콘솔을 통해 방금 전에 생성한 개체에 레코드를 추가, 검색, 수정, 삭제를 해보겠습니다.

 

먼저, 화면 상단에 표시된 [로그인 유저명 -> Developer Console]을 선택해 개발자 콘솔을 표시합니다.

 

그 후, [Query Editor] 탭을 선택해 SOQL 쿼리 입력란을 표시합니다.

 

SOQL 입력란에 다음 쿼리를 입력한 후, [Execute] 버튼을 눌러줍니다.

※ 개발자 콘솔의 쿼리 에디터에서는 "SELECT"만 사용 가능합니다.
   이 외의 조작은 SELECT 후에 표시되는 버튼을 통해서 조작 가능합니다.

SELECT Id, Name, Genre__c, ReleaseDate__c, ProductionCompany__c FROM Game__c

 

현재는 레코드가 전혀 없기 때문에, "Query Results - Total Rows: 0"이 표시됩니다.

하지만, 결과 화면의 하단부를 보면 [Save Rows], [Insert Row], [Delete Row], [Refresh Grid] 버튼이 생긴 것을 확인할 수 있습니다.

레코드를 한 개 추가해보겠습니다.

 

먼저, [Insert Row] 버튼을 눌러줍니다. 그 후, 다음과 같이 입력한 후, [Save Rows] 버튼을 눌러 레코드를 저장합니다. 

 

이렇게 2개의 레코드를 추가하였습니다.

 

레코드의 수정은 수정할 항목을 더블 클릭한 후, 내용을 수정, [Save Rows] 버튼을 눌러 레코드를 저장합니다.

레코드의 삭제는 삭제할 항목을 선택한 후, [Delete Row] 버튼을 눌러 레코드를 삭제합니다.


# Apex를 통한 데이터 검색, 생성, 삭제

Salesforce의 Apex에서는 개체를 조작할 수 있는 5개의 CRUD 명령어가 존재합니다.

  1. SELECT : 레코드 검색

  2. INSERT : 레코드 등록

  3. UPDATE : 레코드 수정(레코드ID 필요)

  4. DELETE : 레코드 삭제(레코드ID 필요)

  5. UPSERT : 레코드 등록 및 수정

"UPSERT"는 Salesforce 고유의 CRUD 명령어입니다.

 

UPSERT는 CRUD처리 대상이 되는 리스트 등에 있는 요소가 이미 개체에 존재하고 있는 경우에는 수정(UPDATE)을,

존재하지 않는 경우에는 등록(INSERT)을 실시합니다.

 

CRUD처리를 실행할 SOQL 테스트용 Apex 컨트롤러 클래스를 하나 생성합니다.

 

생성된 클래스에 다음과 같이 코드를 입력해줍니다.

 ※ 결과는 개발자 콘솔에 디버그 로그를 표시해서 확인하겠습니다.

/**
 * @description 게임 정보 표시화면 컨트롤러
 */
public class CntrlDisplayGame {

    /**
 	 * @description 생성자
 	 */
    public CntrlDisplayGame() {

        searchGameInfo();		// 현재 등록되어있는 게임 정보 검색(SELECT)
        createGameInfo();		// 새로운 게임 정보를 추가(INSERT)
        updateGameInfo();		// 게임 정보 수정(UPDATE)
        deleteGameInfo();		// 게임 정보 삭제(DELETE)
        upsertGameInfo();		// 게임 정보 추가 및 수정
    }

    /**
 	 * @description 게임 정보 검색(select)
 	 */
    public void searchGameInfo() {

        List<Game__c> gameList = [SELECT Id, Name, Genre__c, ReleaseDate__c, ProductionCompany__c FROM Game__c];

        System.debug('=================== SELECT 결과_START ==================');
        System.debug('SELECT 결과수 : ' + gameList.size());
        for (Game__c game : gameList) {

            System.debug('----------------------------------------------------');
            System.debug('게임 타이틀 : ' + game.Name);
            System.debug('게임 장르 : ' + game.Genre__c);
            System.debug('게임 출시일 : ' + game.ReleaseDate__c);
            System.debug('게임 제작사 : ' + game.ProductionCompany__c);
        }
        System.debug('===================== SELECT 결과_END ==================');
    }

    /**
 	 * @description 게임 정보 추가(insert)
 	 */
    public void createGameInfo() {

        Game__c newGame = new Game__c();

        newGame.Name = 'StarCraft';									// 게임명
        newGame.Genre__c = 'RTS';									// 게임 장르
        newGame.ReleaseDate__c = Date.newInstance(2020, 11, 30);	// 게임 출시일
        newGame.ProductionCompany__c = 'Blizzard';					// 게임 제작사

        // 게임 정보 등록(INSERT)
        insert newGame;

        List<Game__c> validGameList = [SELECT Id, Name, Genre__c, ReleaseDate__c, ProductionCompany__c FROM Game__c];
        System.debug('=================== INSERT 결과_START ==================');
        System.debug('SELECT 결과수 : ' + validGameList.size());
        for (Game__c game : validGameList) {

            System.debug('----------------------------------------------------');
            System.debug('게임 타이틀 : ' + game.Name);
            System.debug('게임 장르 : ' + game.Genre__c);
            System.debug('게임 출시일 : ' + game.ReleaseDate__c);
            System.debug('게임 제작사 : ' + game.ProductionCompany__c);
        }
        System.debug('===================== INSERT 결과_END ==================');
    }

    /**
 	 * @description 게임 정보 수정(update)
 	 */
    public void updateGameInfo() {

        List<Game__c> gameList = [SELECT Id, Name, Genre__c, ReleaseDate__c, ProductionCompany__c FROM Game__c];

        // 새로 추가한 StarCraft 정보 수정
        // Index를 알고 있는 경우
        //Game__c editGame = gameList.get(3);
        //Game__c editGame = gameList[3];

        Game__c editGame;

        for (Game__c game : gameList) {
            // SELECT한 게임 정보의 리스트를 루프

            //if (game.Name.equals('StarCraft')) {				// equals 			: 대소문자 구분
            if (game.Name.equalsIgnoreCase('StarCraft')) {		// equalsIgnoreCase : 대소문자 구분 X
                // 게임이름이 "StarCraft" 인 게임 정보 레코드를 습득

                editGame = game;
                break;
            }
        }

        System.debug('=================== UPDATE 결과_START ==================');
		System.debug('UPDATE 이전 출시일 : ' + editGame.ReleaseDate__c);

        // 수정할 게임의 출시일을 수정
        editGame.ReleaseDate__c = Date.newInstance(1998, 11, 30);

        // 게임 정보 등록
        update editGame;

        // 게임명이 "StarCraft"인 레코드를 SELECT(SOQL에서는 대소문자 구분 X)
        List<Game__c> validGame = [SELECT Id, ReleaseDate__c FROM Game__c WHERE Name = 'StarCraft'];

        System.debug('UPDATE 이후 출시일 : ' + validGame.get(0).ReleaseDate__c);
        System.debug('=================== UPDATE END ==========================');
    }

    /**
 	 * @description 게임 삭제(delete)
 	 */
    public void deleteGameInfo() {

        List<Game__c> gameList = [SELECT Id, Name, Genre__c, ReleaseDate__c, ProductionCompany__c FROM Game__c];

        // 새로 추가한 StarCraft 게임 정보 삭제
        Game__c delGame;

        for (Game__c game : gameList) {
            // SELECT한 게임 정보의 리스트를 루프

            if (game.Name.equalsIgnoreCase('StarCraft')) {		// equalsIgnoreCase : 대소문자 구분 X
                // 게임이름이 "StarCraft" 인 게임 정보 레코드를 습득

                delGame = game;
                break;
            }
        }

        delete delGame;

        
		// 게임명이 "StarCraft"인 레코드를 SELECT(SOQL에서는 대소문자 구분 X)
        List<Game__c> validGame = [SELECT Id, ReleaseDate__c FROM Game__c WHERE Name = 'StarCraft'];        
        System.debug('=================== DELETE 결과_START ==================');
        System.debug('게임 이름이 StarCraft인 레코드 SELECT 결과 : ' + validGame.size());
        System.debug('=================== DELETE 결과_END ====================');
    }

    /**
 	 * @description 게임 정보 추가 및 수정(upsert)
 	 */
    public void upsertGameInfo() {

        // 게임 개체에 등록되어 있는 레코드를 SELECT
        List<Game__c> gameList = [SELECT Id, Name, Genre__c, ReleaseDate__c, ProductionCompany__c FROM Game__c];

        // 신규 추가용 게임 정보 정의
        Game__c newGame = new Game__c(
        	Name = 'OverWatch',
            Genre__c = 'FPS',
            ReleaseDate__c = Date.newInstance(2016, 5, 24),
            ProductionCompany__c = 'Blizzard'
        );

        System.debug('=================== UPSERT 이전_START ==================');
        System.debug('SELECT 결과수 : ' + gameList.size());
        for (Game__c game : gameList) {

            System.debug('----------------------------------------------------');
            System.debug('게임 타이틀 : ' + game.Name);
            System.debug('게임 장르 : ' + game.Genre__c);
            System.debug('게임 출시일 : ' + game.ReleaseDate__c);
            System.debug('게임 제작사 : ' + game.ProductionCompany__c);
        }
        System.debug('=================== UPSERT 이전_END ====================');

        // SELECT로 얻어온 게임 정보 리스트의 첫번째 레코드의 제작사를 변경
        gameList.get(0).ProductionCompany__c = '펍지';
        
        // upsert 대상 리스트에 신규 추가용 게임 정보를 추가
        gameList.add(newGame);

        // 게임 정보 리스트를 UPSERT
        upsert gameList;

        // 게임 개체에 등록되어 있는 레코드를 SELECT
        List<Game__c> validGameList = [SELECT Id, Name, Genre__c, ReleaseDate__c, ProductionCompany__c FROM Game__c];

        System.debug('=================== UPSERT 이후_START ==================');
        System.debug('SELECT 결과수 : ' + validGameList.size());
        for (Game__c game : validGameList) {

            System.debug('----------------------------------------------------');
            System.debug('게임 타이틀 : ' + game.Name);
            System.debug('게임 장르 : ' + game.Genre__c);
            System.debug('게임 출시일 : ' + game.ReleaseDate__c);
            System.debug('게임 제작사 : ' + game.ProductionCompany__c);
        }
        System.debug('=================== UPSERT 이후_END ====================');
    }
}

 

코드 입력이 끝났다면, 개발자 콘솔에서 [Debug -> Open Execute Anonymous Window]를 선택해 Apex Code 입력창을 표시합니다.

Apex Code 입력창에서 다음 코드를 입력합니다.

// 데이터베이스(개체)를 롤백할 지점 설정
Savepoint sp = Database.setSavepoint();

// Apex 컨트롤러의 생성자를 호출
CntrlDisplayGame cdg = new CntrlDisplayGame();

// 데이터베이스 롤백
Database.rollback(sp);

그 후, □Open Log를 체크한 후, [Execute]버튼을 눌러 코드를 실행합니다.

 

코드가 실행되면 개발자 콘솔에 자동으로 로그 화면이 표시됩니다.

로그가 표시되면, 가운데 부분에 있는 □Debug Only를 체크합니다.

□Debug Only를 체크하면 Apex 코드에서 System.debug()로 지정한 로그만 표시할 수 있습니다.

 


이상으로 Salesforce에서의 개체(오브젝트) 생성 방법 및 Apex 내에서 SOQL을 이용해 개체의 레코드를 검색, 추가, 수정, 삭제 하는 방법에 대해 알아보았습니다.

 

이번 포스트까지 Salesforce로 개발하는 방법에 대한 기초 지식을 알아보았습니다.

 

다음 포스트에서는 개체의 레코드 정보를 Visualforce 화면에 표시하는 방법을 설명함과 동시에 간단한 도서 관리 프로그램을 만들어 보겠습니다.

 

도서 관리 프로그램이라 해도 단순히 "도서 검색 화면", "도서 정보 추가 및 수정 화면", "도서 상세 정보 표시 화면"을 만들고, 각각의 화면에서 도서 개체에 대해 CRUD 처리를 하는 것을 연습할 예정입니다.

 

 

참고) https://developer.salesforce.com/docs/atlas.en-us.224.0.apexcode.meta/apexcode/apex_methods_system_string.htm - Apex 개발자 가이드(String 클래스)

+ Recent posts