1.하나의 앱을 생성하기 위해서는 앱과 어플리케이션에 필요한 객체를 생성해야 하며

각 객체들 또한 해당 작업을 위한 필드들이 생성되어야 하기 때문에

어떤 작업이 필요한지 생각하고 구조적으로 계획을 먼저 작성해야 한다.

 

전반적으로 계획을 작성한 후

해당 작업에 필요한 객체들과 객체에 필요한 필드들을 생성한 후

페이지 레이아웃, 축소 레이아웃, 전역 작업을 사용하여

브라우저 및 Salesforce 모바일 앱에서 사용자 인터페이스를 수정하고

수식, 유효성검사, 규칙, 플로우, 프로세스 절차 등을 사용해 비즈니스 로직을 구현한 다음

보고서, 대시보드를 생성해 효과적으로 자원 관리 등을 통해 앱 생성을 진행할 수 있다.

 

객체는 Object Manager, 필드는 각 객체의 Fields & Relationships,

커스텀 앱의 tab 수정은 Tabs, 피드 추적은 Feed Tracking, 앱 생성은 App Manager에서 할 수 있다.

 

 

2.검증 규칙은 Object Manager의 Validation Rules에서 관리할 수 있는데

새로운 유효성 검사를 생성할 경우 규칙명, 에러 검증 수식, 에러 반환 메세지 등을 입력해야 한다.

 

예를 들어 학생의 성적의 경우 0~100점까지만 가능하지만 음수/100점 초과/공백, 문자열 등이 입력될 경우 에러메세지를 출력하며 값의 저장을 막을 수 있다.

 

 

3.Flow Builder를 통해서 Flow를 생성할 수 있고

기준이 될 객체를 선택한 후 내부 동작을 통해 과정을 관리할 수 있다.

 

예를 들어 특정 조건이 달성될 경우

조건 달성으로 인해 변경해야할 상태들을 수정할 수 있고

해당 트리거 작동으로 인한 작업들을 자동으로 진행할 수 있다.

(아래에서는 Chatter에 post)

flow builder를 사용해 만든 flow

 

 

4.보고서를 생성할 때 Columns에서 추가하고 싶은 열을 고를 수 있으며

그룹 추가를 선택해 여러개의 그룹을 동시에 확인할 수도 있다.

 

이 부분을 진행하며 계속 통과가 되지 않아 통화 변경을 확인했는데

통화 변경은 Company Information에서 진행할 수 있었고

그래도 문제가 해결되지 않아 생성, 삭제를 반복했지만 해결되지 않아

검색을 해보니 황당하게도 objecr name이 Supply가 아니라 Supplise라서 통과되지 않은 것이었다.

 

이 과제의 4/5번째가 억지로 통과되지 않아 해결책이 Supply를 Supplise로 변경하는 것이었는데

여기서는 다시 Supplise를 Supply로 변경해야 통과되는 황당한 시스템을 보고 어이가 없었다.

 

 

5.우측 상단 Setup을 통해 Developer Console을 열 수 있고

아래와 같은 순서를 통해 apex 편집을 시작할 수 있다.

file → new → Apex Class → writing Class name

 

만들어진 클래스 내부에 메서드를 추가할 경우

명령어를 통해 해당 메서드를 사용할 수 있게 되며

디버그를 작동시키기 위해서는 Open Execute Anonymous Window 내부에서

className.method();를 입력해 작동시킬 수 있다.

 

 

6.Apex는 기본적으로 아래와 같은 특징을 가지고 있다.

  • 호스팅 - 서버인 Lightning Platform에서 저장, 컴파일 및 실행
  • 개체 지향 - 클래스, 인터페이스 및 상속을 지원
  • 강타입- 컴파일 할 때 개체에 대한 참조의 유효성을 검사
  • 다중 테넌트 인식 - 다중 테넌트 플랫폼에서 실행되므로 코드가 공유 리소스를 독점하는 것을 방지하는 제한을 적용하여 런어웨이 코드를 보호한다.
  • 데이터베이스와 통합 - 레코드 및 해당 필드에 대한 직접 액세스를 제공하고 해당 레코드를 조작하기 위한 문 및 쿼리 언어를 제공
  • 데이터 중심 - 데이터베이스에 대한 트랜잭션 액세스를 제공하여 작업을 롤백할 수 있다.
  • Java 친화적 - Apex는 Java 관용구 기반
  • 테스트 용이성 - 유닛 테스트 생성, 실행 및 코드 검사에 대한 기본 제공 지원을 제공하기 때문에 Salesforce는 플랫폼 업그레이드 전에 모든 유닛 테스트를 실행하여 모든 사용자 정의 Apex 코드가 예상대로 작동하는지 확인할 수 있다.
  • 버전 관리 - 사용자 정의 코드는 API의 다른 버전에 대해 저장할 수 있다.

 

7.apex가 사용하는 java의 특징인 것 같은데 static을 선언해야만 바로 사용할 수 있고

static을 선언하지 않은 경우에는 new를 통해 해당 클래스를 선언해서 사용해야한다.

 

인스턴스 메서드와 인스턴스 변수가 인스턴스 또는 개체 수준인 반면

정적 메서드와 정적 변수는 클래스 수준이기 때문에 즉각 사용할 수 있다고 하는데

간단하게 static을 사용해야 className.methodName() 형태의 시작이 가능하고

static으로 선언하지 않은 경우 아래와 같이 작동해야 한다.

className newName = new className();

newName.methodName();

 

 

8.타입지정까지는 TypeScript를 쓴다는 느낌으로 어떻게 적응을 했는데

console.log, print도 아니라 System.debug()를 통해 로그를 볼 수 있었는데

아직까지는 적응 기간이 많이 필요할 것 같다.

 

System.debug() 외에도 push가 아닌 .add()를 사용해 값을 추가해야 하며

push등을 사용하고 싶을 경우 type을 stack으로 지정해야 하는 것 같다.

 

 

9.custom으로 제작된 객체, 필드의 이름 끝에는 __c가 붙고

사용자 정의 관계 필드의 경우 __r이 붙으며

이름의 공백은 ‘_’로 대체된다.

(new custom field → new_custom_field)

 

 

10.DML(Data Manipulation Language)로 Salesforce에서 레코드를 만들고 수정할 수 있는데

아래의 DML Statements를 사용해 조작할 수 있다.

  • insert - 삽입
  • update - 업데이트
  • delete - 삭제(삭제된 레코드는 15일간 휴지통에서 보관)
  • upsert - sfdc 고유 기능으로 insert와 update를 합친 말이다. 값이 존재할 경우 없데이트, 없을 경우 생성을 하기 때문에 삽입, 수정의 합성어인 upsert가 되었다.
  • undelete - 삭제 취소(삭제불가로 설정된 경우에만 복구 가능하며 master-detail의 경우 master 삭제로 인한 하위 데이터 삭제의 경우 master를 복구해도 하위 데이터는 복구되지 않는다)
  • merge - 중복 제거를 목적으로 사용된다.

DML은 주로 try/catch와 함께 사용된다.

public class AccountHandler {
    Public static Account insertNewAccount(String accountName){
        try{
        	Account acct = new Account(Name = accountName);
        	insert acct;
        	Return acct;
        }        
        catch (DMLexception error) {
        	return null;
        }  
	}
}

 

 

11.Database 또한 사용 가능한데 위와 동일한 메서드지만 앞에 Database를 붙이는 것과

try/catch가 아닌 allOrNone 매개변수가 들어있기 때문에 성공,실패 결과 객체가 반환된다.

  • Database.insert()
  • Database.update()
  • Database.upsert()
  • Database.delete()
  • Database.undelete()
  • Database.merge()

삽입, 업데이트의 경우 Database.SaveResult 객체를 반환하며(type 설정 때문에 알아야 한다)

allOrNone은 true가 기본 설정인데 true로 설정된 경우

하나라도 에러가 발생할 경우 해당 메서드 내의 모든 작업 적용이 롤백된다.

// Create a list of contacts
List<Contact> conList = new List<Contact> {
        new Contact(FirstName='Joe',LastName='Smith',Department='Finance'),
        new Contact(FirstName='Kathy',LastName='Smith',Department='Technology'),
        new Contact(FirstName='Caroline',LastName='Roth',Department='Finance'),
        new Contact()};
// Bulk insert all contacts with one DML call
Database.SaveResult[] srList = Database.insert(conList, false);
// Iterate through each returned result
for (Database.SaveResult sr : srList) {
    if (sr.isSuccess()) {
        // Operation was successful, so get the ID of the record that was processed
        System.debug('Successfully inserted contact. Contact ID: ' + sr.getId());
    } else {
        // Operation failed, so get all errors
        for(Database.Error err : sr.getErrors()) {
            System.debug('The following error has occurred.');
            System.debug(err.getStatusCode() + ': ' + err.getMessage());
            System.debug('Contact fields that affected this error: ' + err.getFields());
	 }
    }
}

 

 

 

 

 

 

(1).백준 14920번 3n+1 수열은 짝수인 경우 2로 나누고 홀수인 경우 3n+1의 작업을 진행하는 문제였다.

while문 내부에서 1보다 큰 경우 계속해서 돌리며 count를 1씩 증가시켰고

시작 숫자 또한 갯수에 포함시키는 방식의 문제였기 때문에 count의 시작 값을 1로 진행했다.

 

%2를 통해 true(1)인 경우 홀수이기 때문에 3n*1 처리를 했고

else의 경우 짝수이기 떄문에 /2처리를 반복해서 해결했다.

let input = 26
let count = 1

while(input > 1){
    if(input % 2){
        input = input*3 + 1
    }
    else{
        input /= 2
    }
    count++
}

console.log(count)

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

[수습일지] - 17  (0) 2023.04.12
[수습일지] - 16  (0) 2023.04.11
[수습일지] - 14(주말)  (0) 2023.04.09
[수습일지] - 13(주말)  (0) 2023.04.08
[수습일지] - 12  (0) 2023.04.07

+ Recent posts