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)

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 |
