본 포스트에서는 Visual Studio Code(이하 VSCode)에서 Apex, VIsualforce를 개발할 수 있는 개발 환경을 구축하는 방법에 대해 알아보겠습니다.

 

이전에는 Eclipse에서 Force.com을 연동하여 사용했었지만, 2019년 10월 부터 지원이 중단되었기 때문에,

현재는 Eclipse에서 Force.com을 연동할 수가 없게 되었습니다.

(기존에 사용중인 Eclipse를 복제해서 사용하는 방법은 가능)

 

그 대신, VSCode에서 Salesforce의 개발이 가능하게 되었기 떄문에 대부분의 SFDC개발자들이 VSCode를 사용하는 추세입니다.

(지금 회사에서는 현재 진행중인 프로젝트까지 Eclipse로 하고있는건 비밀)


목차

  • Visual Studio Code 설치 및 환경 구축

  • Salesforce 계정 연동

  • 소스 코드 습득 및 갱신(Retrieve & Deploy)


# Visual Studio Code 설치 및 환경 구축

 

1. Salesforce CLI 설치

VSCode에서 Force.com을 사용하기 위해서는 "Salesforce CLI" 가 필요합니다.

Salesforce CLI는 이곳 자신의 OS에 맞는 버전을 다운로드 해주세요

 

그 후, Salesforce CLI를 설치해주세요.

다운로드 위치 이외에는 딱히 설정을 바꾸지 않고 다음만 눌러주셔도 무방합니다.

 

2. VSCode 설치

VSCode는 이곳 에서 자신의 OS에 맞는 버전을 다운로드 해주세요.

※ 참고로 저는 System Installer 로 설치했습니다만, 본인이 원하는 것으로 설치해주셔도 무방합니다.

 

☞ User Installer 와 System Installer의 차이점

이름 내용
User Installer 현재의 사용자(OS User)만 사용 가능하게 하고 싶은 경우
System Installer 모든 OS 사용자가 사용 가능하게 하고 싶은 경우 (주로 개인용 PC)

 

그 후, VSCode를 설치해주세요.

※ 설치 시, "PATH에 추가(다시 시작한 후 사용 가능)"에 체크해 주세요.

※ VSCode를 설치한 후, PC를 재부팅해주세요.

 

3. 확장기능 추가

VSCode 왼쪽에 있는 아이콘들 중 확장기능(Extensions)를 선택한 후, 아래의 확장 기능 들을 검색, 설치합니다.

"Salesforce Extension Pack"에 의해 대부분 자동으로 설치되지만 가끔 설치가 안되는 것들도 있기 때문에, 전부 확인할 필요가 있습니다.

 

☞추가할 확장 기능

  • Salesforce CLI Integration

  • Salesforce Extension Pack

  • Apex

  • Apex Interative Debugger

  • Apex Replay Debugger

  • Aura Components

  • ESLint

  • Lightning Web Components

  • Salesforce Toolkit

  • Visualforce

  • Prettier - Code formatter

  • Edit csv (VSCode를 CSV에디터로서 사용할 수 있게 해주는 확장기능)

  • XML

이 외에, 필요에 따라 확장 기능을 추가해주시면 되겠습니다.

 

4. 환경 설정

먼저, Java를 설정합니다.

[File - Preferences - Settings] 를 선택해서 설정 화면을 표시합니다.

 

설정 화면에 표시되는 검색란에 "apex" 를 입력한 후, 화면에 표시되는 메뉴에서

[Extenstions - Salesforce apex configuration]을 선택합니다.

 

그 후, "Salesforcedx-vscode-apex > Java : Home"에 사용 중인 Java의 경로를 설정해 줍니다.

※ JAVA가 없는 경우, 이곳 에서 다운로드 및 설치 해주시기 바랍니다.


# Salesforce 계정 연동

 

계정을 연동하기 위해서는 먼저 프로젝트를 생성해 줄 필요가 있습니다.

우선, 프로젝트를 생성하겠습니다.

 

다음의 순서로 프로젝트를 생성합니다.

 1) [View - Command Palette] 또는 [Ctrl + Shift + P] 키를 눌러 커맨드 팔레트를 표시

 2) 표시한 커맨드 팔레트에 ">SFDX:create project with manifest" 를 입력한 후 선택

 3) "Standard" 선택

 4) Standard 선택 후 표시되는 입력란에 "프로젝트 명"을 입력

 5) 프로젝트를 생성할 위치를 선택

 

프로젝트가 생성되었다면, 생성한 프로젝트에 Salesforce 계정을 연동해봅시다.

 

다음의 순서로 계정을 연동합니다.

 1) 커맨트 팔레트에 ">SFDX:Authorize an Org"를 입력한 후 선택

 2) 접속할 종류를 선택합니다. (일반적인 개발 환경인 경우 "Production")

 3) 연동할 계정의 목적에 맞는 조직명을 입력합니다. (대충 지어도 상관은 X)

 4) Salesforce 로그인 화면이 표시되면 연동할 계정의 ID와 패스워드를 입력한 후 로그인합니다.

 5) 접속이 완료되면 Salesforce CLI의 허가를 승낙한 후, 브라우저를 닫습니다.

 

계정이 연동되면 VSCode의 하단부에서 연동중인 개발 환경의 정보를 확인할 수 있습니다.


# 소스 코드 습득 및 갱신 (Retrieve & Deploy)

 

우선 연동 중인 환경에 저장되어 있는 패키지의 소스를 습득하는 방법에 대해 알아보겠습니다.

 

혹시, 현재 개발 중인 프로젝트가 있는 경우, 사용중인 package.xml을 복사해서 다음 디렉토리에 덮어씌울 필요가 있습니다.

package.xml위치 : [VSCode에서 생성한 프로젝트의 디렉토리 - manifest - package.xml]

 

VSCode의 프로젝트의 [manifest - package.xml]에서 오른쪽 버튼을 누른 후,

"SFDX: Retrieve Source in Manifest from org" 를 선택해 개발 환경에 있는 패키지를 습득합니다.

소스 코드의 습득(Retrieve)가 완료되면 [force-app] 에서 소스 코드를 확인할 수 있습니다.

 

반대로 VSCode에서 수정한 소스 코드를 개발 환경에 적용(Deploy)할 경우,

[manifest - package.xml]에서 우클릭, "SFDX: Deploy Source in Manifest to org" 를 선택합니다.

 

하지만, package.xmlRetrieve나 Deploy를 할 경우, package.xml에 지정되어 있는 모든 소스가 습득 및 저장 되기 때문에, 개발 중에는 수정한 코드에 대해서만 Retrieve나 Deploy를 해주는 것이 좋습니다.

 

수정한 코드에 대해서만 습득, 저장 하는 방법은 해당 파일에서 우클릭,

"SFDX: Retrieve Source from org(습득)" 또는 "SFDX: Deploy Source to org(저장)"를 선택하시면 됩니다.

 

※ package.xml에 대한 내용은 추후에 다시 다루도록 하겠습니다.

간단하게 설명하자면, Salesforce로 개발한 패키지(소스 코드, 개체, 등등의 모든 요소)를 관리하는데에 사용되는 xml파일 입니다.

이 package.xml 이 없으면, Eclipse나 VSCode로의 개발이 불가능합니다.


이상으로, Force.com을 Visual Studio Code에서 개발하기 위한 환경 구축 방법에 대해 알아보았습니다.

 

본 포스트에서 기술한 코드 습득 방법 외에, VSCode에서의 테스트 코드 실행 방법, SOQL 실행방법 등의 기능도 있습니다.

이 내용들에 대해서는 추후에 위 내용에 관련된 포스팅을 올릴 때에 설명하도록 하겠습니다.

 

또한 앞으로 올릴 포스팅에서는 브라우저의 개발자 콘솔이 아닌, VSCode로 코드를 작성하도록 하겠습니다.

(저도 사용법을 연습해야 하기 떄문에..)

 

 

'Salesforce.com > SFDC Memo' 카테고리의 다른 글

[SFDC] Salesforce Governor Limits  (0) 2020.08.12
[SFDC] 기본 개념 정리1  (0) 2020.08.10

본 포스터에서는 이전에 작성한 도서 관리 프로그램에서 사용하고 있는 레코드의 데이터 타입 이외에 자주 사용되는 데이터 타입의 사용법에 대해 알아보겠습니다.

 

이전에 작성한 도서 관리 프로그램은 아래의 링크에서 확인하실 수 있습니다.

2020/07/02 - [Salesforce.com/Force.com] - [SFDC] Salesforce 기초4) Apex와 Visualforce 개발 연습 - 도서 관리 프로그램


# 목차

  • 화면 설계(추가)

  • 개체 및 레코드 추가

  • 소스 코드 작성

  • 결과 화면


# 화면 설계(추가)

 

이번 도서 관리 프로그램은 이전에 작성한 프로그램에서 회원 관리 화면을 추가하겠습니다.

 

추가할 화면은 아래와 같습니다.

  • 회원 검색 화면

  • 회원 상세 화면

  • 회원 편집 화면

또한, 도서 개체에 아래의 아래의 레코드를 추가하겠습니다.

  • 대여 유무 : 확인란

  • 대여자 번호 : 텍스트

  • 대여자 이름 : 텍스트

  • 대여자 : 조회관계(회원)

  • 대여일 : 날짜

  • 반납일 : 날짜

도서관리 프로그램(도서 관리 화면 설계서).xlsx
0.04MB

 


# 개체 및 레코드 추가

 

먼저, "회원(Member__c)"이라는 명칭의 개체를 추가합니다.

 

그 후, "회원" 개체에 다음 레코드를 추가해줍니다.

※ 개체 및 레코드(필드) 추가는 [SFDC] Salesforce 기초3) 개체(오브젝트)의 생성 및 사용법 를 참고해주세요.

추가할 레코드

필드 레이블명 필드명(API 참조명) 데이터타입 길이 선택항목
회원 번호 MemberNo__c 텍스트 10  
회원명 Name 텍스트 80  
회원 등록일 RegistDate__c 날짜    
전화 번호 Phone__c 전화    
이메일 주소 Email__c 이메일    
대여 유무 IsLental__c 확인란    
반납 유무 ReturnBook__c 선택항목   미대여, 미반납, 반납, 연체

 

개체 및 레코드 추가 결과는 다음과 같습니다.

 

다음으로, "도서" 개체에 아래의 레코드를 추가합니다.

 

 추가할 레코드

필드 레이블명 필드명(API 참조명) 데이터타입 길이 선택항목 비고
대여 유무 IsLent__c 확인란      
대여자 번호 LenderNo__c 텍스트 10    
대여자 이름 LenderName__c 텍스트 80    
대여자 Lender__c 조회관계(회원)     하위 관계 이름 : Lender_Book_Rel
대여일 LentDate__c 날짜      
반납일 ReturnDate__c 날짜      

 

레코드 추가 결과

도서.xlsx
0.01MB
회원.xlsx
0.01MB

 

※ 레코드의 데이터타입 관련 주의

1. [참조 관계] : 참조 관계에 설정되는 은 참조 대상 레코드의 ID 값

  1-1) 참조 중인 개체의 레코드를 참조하는 방법은 [API참조명__r.레코드명]

      예) 도서 개체의 회원(Lender__c) 을 통해, 회원의 회원번호 레코드 참조

           => Lender__r.MemberNo__c

 

2. [날짜 or 날짜/시간] : 날짜 또는 날짜/시간의 값은 현재 Salesforce 개인 설정에 설정되어 있는 지역, 언어에 따라 표시되는 포맷이 다르다.

      예) 한국 => 2020. 7. 20.  (가장 마지막에 붙어있는 [온점(.)] 이 없으면 에러)

           일본 => 2020/7/20

           미국 => 7/20/2020

 

3. [이메일, 전화, FAX] : 실제 코드에서는 기본적으로 텍스트 형식으로 취급함.


# 소스 코드 작성

 

추가할 클래스와 페이지는 다음과 같습니다.

 

☞ Apex 클래스

  • CntrlMemberSearch : 회원 검색 화면 컨트롤러

  • CntrlMemberDetail : 회원 상세 화면 컨트롤러

  • CntrlMemberEdit : 회원 편집 화면 컨트롤러

  • DaoMember : 회원 개체에 접근하기 위한 Dao

☞ Visualforce 페이지

  • MemberSearch : 회원 검색 화면

  • MemberDetail : 회원 상세 화면

  • MemberEdit : 회원 편집 화면

 

소스 코드아래의 링크에서 확인하실 수 있습니다.

https://github.com/mokochi/Blog_SFDC_force.com_basic5

 

 

※ 소스 코드 관련 추가 설명

1. [SelectOption 타입] : 컨트롤러 클래스에서 사용중인 "SelectOption" 타입은 선택리스트, 체크 박스와 같이 선택 관련 요소를 만드는데 사용되는 데이터 타입

 

2. Visualforce화면은 HTML 태그 만으로도 구성이 가능하다.

 

3. [<apex:pageBlockSectionItem> 태그] : 기본적으로, pageBlockSectionItem 태그는 <apex:pageBlockSection> 태그 내에서만 사용 가능하다.

이 외에 <apex:pageBlockSectionItem>을 사용하는 곳사용하지 않는 곳구분하는 방법

개체의 레코드를 직접적으로 표시하는 경우,

즉, <apex:outputField> 또는 <apex:inputField>를 사용하는 경우는 필요가 없지만,

 

그 외의 경우에는 <apex:pageBlockSectionItem> 태그를 사용하여 <apex:pageBlockSection> 내에서 표시할 요소라는 것을 지정해 줄 필요가 있다.

 

★ 페이지의 각종 태그에 대한 정보나, 클래스에서 사용하는 데이터 타입, 메서드와 같은 정보는

   페이지 맨 아래에 표시중인 Salesforce 가이드를 참고해주세요. ★

 


# 결과 화면

 *메뉴 화면 

 

 *회원 검색 화면(검색 전) 

 

 *회원 검색 화면(검색 후) 

 

 *회원 상세 화면 

 

 *회원 편집 화면(추가) 

 

 *회원 편집 화면(편집) 

 

 *도서 상세 화면 

 

 *도서 편집 화면(편집) 

 

 *도서 편집 화면(대여자 지정) 


이상으로 실제 개발시에 자주 사용하는 레코드 데이터 타입의 사용 방법에 대해 간단히 알아보았습니다.

 

물론 전부 다 사용해보지 않았기 때문에, 앞으로도 천천히 추가해 나갈 생각입니다만,

 

다음 포스트 부터는 기술적인 부분을 위주로 올릴 예정입니다.

즉, 개발 기초에 대한 내용은 이번 포스트로 끝입니다.

 

제가 생각하기에도 기초라고 해놓고선 설명이 부족한 부분이 많았고,글을 올리고 난 뒤 읽어보면 뭔가 일단

"그냥 소스 보고 따라쳐보세요. 가능한 주석 많이 달아놨으니 읽고 이해해보세요."

라는 느낌의 글이 되어 있었습니다.

 

아마 인터넷에 글을 쓰는 것이 처음이다보니 어찌 써야할 지 몰라 넘겨버리게 되는 부분이 있었던 것 같습니다.

(실제 SNS나 인터넷 이런 곳에 댓글이나 타임라인도 거의 안쓰는 사람이라..)

 

그런 부분에 있어서는 댓글 같은이나 방명록 등, 얼마든지 질문해주시면 제가 알고 있는 지식 선에서, 또는 같이 조사해보고 되도록 대답해 드리도록 노력할 생각입니다.

 

물론, 앞으로 계속해서 올릴 글에서도 가능한 자세하게 설명을 추가할 것입니다.

 

다음 포스트로 어떤 글을 올릴지 아직 정하지 않았으나, 가까운 시일내에, 그리고 꾸준히 올릴 수 있도록 하겠습니다.

 

p.s) 참고로, 제 글이나 GitHub에 있는 소스 얼마든지 퍼가셔도 됩니다만, 기본적으로 출처 정도는 남겨주시면 감사하겠습니다.

 

 

 

 

 

참고1) https://developer.salesforce.com/docs/atlas.en-us.224.0.apexcode.meta/apexcode/apex_dev_guide.htm - Apex 개발자 가이드

참고2) https://developer.salesforce.com/docs/atlas.en-us.226.0.pages.meta/pages/pages_intro.htm - Visualforce 개발자 가이드

 

 

 

 

 

 

 

 

 

 

다음주까지 일이 좀 바빠져서 매일 야근에 이번주도 주말 출근때문에...

 

2020/07/02 - [Salesforce.com/Force.com] - [SFDC] Salesforce 기초4) Apex와 Visualforce 개발 연습 - 도서 관리 프로그램

 

이 이후의 글이 살짝 늦어질 것 같습니다.

 

늦는다고 해봐야 다음주 주말 즈음부터 다시 올릴 수 있도록 노력하겠습니다.

 

라는 변명을 살짝... 헷..

 

다음에 올릴 예정인 다양한 데이터 타입의 레코드 사용방법 설명 겸 도서 관리 프로그램(살짝 업그레이드) 이후로는Salesforce 개발에 대한 기술적인 글만 쭉 올릴 예정입니다.

 

왜냐하면 다음에 올리는 글의 내용까지가 Apex와 Visualforce 개발의 베이스가 되는 부분이고,

그 부분에서 추가적으로 기능을 추가 및 사용하는 것이 전부이기 때문입니다.

 

그러므로 실무에서 자주 사용되는 기술들 + 새로 공부하거나 알게된 내용 + 개발하면서 발생했던 문제들 위주로 올릴 예정입니다. 

 

그럼 다음에 만날때까지 다들 즐거운 나날이 되시길!

'잡담' 카테고리의 다른 글

요즘 왜 글을 안올리냐면..  (2) 2021.06.16
[잡담] 본 블로그를 운영하게 된 이유 + 잡담  (0) 2020.06.20

본 포스트에서는 이전까지 연습한 Salesforce 기초를 바탕으로 간단하게 도서관리 프로그램을 만들어보겠습니다.

 

연습해 볼 내용은 다음과 같습니다.

  1. 개체 및 레코드 생성

  2. SOQL을 통한 추가, 수정, 삭제

  3. 버튼, 링크를 통한 화면 전환 및 값 전달

  4. Apex와 Visualforce페이지 연동


이번 도서 관리 프로그램 다음과 같은 화면으로 구성할 예정입니다.

 

 · 메뉴 화면

 · 도서 검색 화면

 · 도서 상세 화면

 · 도서 편집 화면

 

각 화면의 처리는 다음과 같습니다.

도서관리 프로그램(도서 관리 화면 설계서).xlsx
0.02MB


# 개체 및 레코드 추가

 

가장 먼저 "도서"라는 명칭의 개체를 추가합니다.

 

그 후, "도서" 개체에 다음의 필드를 추가합니다.

※ 개체 및 레코드(필드) 추가는 [SFDC] Salesforce 기초3) 개체(오브젝트)의 생성 및 사용법 를 참고해주세요.

 

☞ 추가할 레코드

필드 레이블명 필드명(API 참조명) 데이터타입 길이 선택 항목
도서 번호 BookNo__c 텍스트 80  
도서명 Name 텍스트 80  
구분 BookType__c 선택 목록   시,소설,수필,자서전
저자 Author__c 텍스트 80  
출판사 Publisher__c 텍스트 80  

 

개체 및 레코드 추가 결과는 다음과 같습니다.

 


# 소스 코드 작성

 

추가할 클래스와 페이지는 다음과 같습니다.

 

☞ Apex 클래스

  • CntrlMenu : 메뉴 화면 컨트롤러

  • CntrlBookSearch : 도서 검색 화면 컨트롤러

  • CntrlBookDetail : 도서 상세 화면 컨트롤러

  • CntrlBookEdit : 도서 편집 화면 컨트롤러

☞ Visualforce 페이지

  • Menu : 메뉴 화면

  • BookSearch : 도서 검색 화면

  • BookDetail : 도서 상세 화면

  • BookEdit : 도서 편집 화면

소스 코드아래의 링크에서 확인 하실 수 있습니다.

https://github.com/mokochi/Blog_SFDC_force.com_basic4


# 결과 화면

 

소스 코드 결과 화면은 다음과 같습니다.

 

 *메뉴 화면 

 

 *도서 검색 화면(검색 전) 

 

 *도서 검색 화면(검색 후) 

※ 검색 조건 [도서명], [저자], [출판사] 부분 검색 가능

 

 *도서 상세 화면

 

 *도서 편집 화면(도서 추가) 

 

 *도서 편집 화면(도서 편집) 

 

 *도서 편집 화면(필수 항목 미입력시) 


이상으로 간단히 도서를 검색, 참조, 등록, 수정, 삭제 할 수 있는 도서 관리 프로그램을 만들어 보았습니다.

 

다음에는 이번 포스트에서 만든 프로그램을 바탕으로 레코드의 데이터 타입이 "조회 관계", "날짜/시간" 등과 같이
다양한 타입의 레코드를 사용하는 방법다른 개체의 레코드를 참조하는 방법에 대해 설명하겠습니다.

 

 

 

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

참고2) https://developer.salesforce.com/docs/atlas.en-us.226.0.pages.meta/pages/pages_intro.htm - Visualforce 개발자 가이드

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

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

 

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


# 목차

  • 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