영어와 한글이 섞인 부분을 정리하며 한글로 통일을 진행했고

기존 고정된 아이디에서 가져오던 것을 js에서 id값을 수정해 ?aaa=’고정값’ 형태로 보내던 것을

?id=quoteId 형태로 변경시켰다.

 

다운로드가 되지 않는 부분은 1시간쯤 더 해보다가 제로에게 질문을 했는데

제로가 가이드가 될 수 있는 페이지를 보여주셔서 다시 적용해보기로 했다.

 

분명 어제도 저 페이지를 1시간 이상 읽었는데

거의 자포자기한 상태로 읽은 상태에서 해서 잘 들어오지 않았는데

여기에 답이 있다는 확신을 가지고 진행하니 에러들을 재미있게 해결할 수 있었다.

 

에러코드 500이 자꾸 출력되었는데 원인은 경로를 제대로 잡지 않아서였다는 것을 알았고

다시 blob까지는 확인할 수 있지만 그 다음 아래의 에러코드를 발견했는데

Number of DML statements: 1 out of 0 ******* CLOSE TO LIMIT

검색 결과 (cacheable=true)을 사용하거나 @wire를 사용할 경우 문제가 발생한다고 한다.

@wire를 사용하지는 않고 있기 때문에 (cacheable=true)를 지우고 시도했다.

 

그래도 되지 않아 계속 확인하다보니 class에서 with sharing도 제거하라고 해서

다시 시도해봤더니 되지 않아서// Database.insert(solnRec, true); 형식으로 시도하려고 했는데

갑자기 다시 테스트하니 작동이 성공했다.

 

한마디로 with sharing 부분이 제거 적용이 늦게 되서 안된 것이고

이 부분에서 해결할 수 있었던 것 같고

그게 아니라면 그 뒤에 meta에 <target>lightning__Tab</target>를 추가했는데 이 문제였을 수 있다.

 

결국 contentVersion에서 생성할 수 있었지만 QuoteDocument에는 들어가지 않았기 때문에

추가적으로 작업을 진행해야 할 것 같다.

PageReference pdf = new pagereference('/apex/quoteTestPage?id=' + id);
    pdf.getParameters().put('id', id);

    Blob body;
    try {
        body = pdf.getContent();
    } catch (Exception e) {
        body = Blob.valueOf('data');
    }

    ContentVersion CV = new ContentVersion();
    CV.Title = 'Quote.pdf';
    CV.PathOnClient = 'Quote.pdf';
    CV.VersionData = body;
    CV.FirstPublishLocationId = id;
    insert CV;

점심식사 후 QuoteDocument를 추가했는데 이상하게 contentVersion에는 두개씩 생겨서

이름을 자세히 보니 QuoteDocument를 생성하면 contentVersion에 자동으로 들어가는 것이라

위에서 타이틀, PathOnClient등의 작업은 딱히 의미가 없었던 것 같았기 때문에

결국 ContentVersion 생성은 지우고 QuoteDocument만 추가하기로 했다.

@AuraEnabled
  public static String makePDF(String id) {
    
    PageReference pdf = new pagereference('/apex/quoteTestPage?id=' + id);
    pdf.getParameters().put('id', id);

    Blob body;
    try {
        body = pdf.getContent();
    } catch (Exception e) {
        body = Blob.valueOf('data');
    }

    insert new QuoteDocument(
    Document = body,
    QuoteId = id
);

 

modal은 외부 클릭시 닫히게 하고 싶었는데

백그라운드 기능을 하는 div 태그는 제대로 작동하지 않았기 때문에

코드 최상단 section 태그에 onclick을 넣어줄 수 밖에 없었다.

<template>
  <section onclick={closeModal} if:true={isModalPoped} role="dialog" tabindex="-1" aria-modal="true"
    aria-labelledby="modal-heading-01" class="slds-modal slds-fade-in-open slds-modal_medium">
    <div class="slds-modal__container" style="height:105vh">
      <div class="slds-modal__header">
        <h1 id="modal-heading-01" class="slds-modal__title slds-hyphenate">
          PDF Preview
        </h1>
      </div>
      <iframe height="1000px" width="100%" src={quoteId}></iframe>
      <div class="slds-modal__footer">
        <button onclick={closeModal} class="slds-button slds-button_neutral" aria-label="Cancel and close">
          Cancel
        </button>
        <button onclick={handleDownloadPDF} class="slds-button slds-button_brand">
          Save
        </button>
      </div>
    </div>
  </section>
  <div if:true={isModalPoped} class="slds-backdrop slds-backdrop_open" role="presentation"></div>
  <button onclick={openModal} class="slds-button slds-button_neutral">
    PDF 생성
  </button>
</template>

 

원래는 stopPropagate?인지 하는 뭔가를 입력해야 하는 것으로 기억하고 있었는데

iframe 내부에는 영향을 주지 않았기 때문에

ifram(pdf)외부에는 cancel, save 버튼 두개 뿐이었고(이것도 한글로 바꿔야겠다)

save 버튼 또한 바로 닫히지만 정상 작동을 했기 때문에(toast 추가 희망)

 

네이밍 규칙의 궁금한 점을 리스트로 만들어 회사분들에게 질문해 확인했다.

--- apex class ---

1.public Quote quote = new Quote(); quote 소문자/대문자 여부 @@카멜

2.public List<QuoteLineItem> itemList = new List<QuoteLineItem>(); itemList 파스칼/카멜 여부 @@카멜

3.public String getQuoteId() { return quoteId;} getQuoteId 파스칼/카멜 여부 @@카멜

4.public class tableType {} tableType 파스칼/카멜 여부(클래스명 파스칼) @@파스칼 TableType 

5.public static String makePDF(String id) { insert new QuoteDocument();} =>makePDF에서 insertQuoteDocument로 변경 여부 @@자유

 

--- vf page ---

5.vf page 이름 => quoteTestPage 파스칼/카멜 여부 @@파스칼 QuoteTestPage

 

--- LWC ---

6.openModal(){} => OpenModal(){} 파스칼/카멜 여부 (Controller, Helper, LWC라고 표기) @@카멜 const errorEvent(){} => ErrorEvent ?? @@카멜

7.const errorEvent 상수 ERROR_EVENT로 변경 여부 @@카멜(전역상수 GNU대문자)

8.일반 변수 파스칼 카멜 여부 @@카멜(아래 4개 모두 왼쪽 카멜)

quoteId => QuoteId

isModalPoped => IsModalPoped

let a => let A .

then(result =>{}) => .then(Result =>{})

 

네이밍 규칙을 지키기 위해 기존의 vf page의 이름을 변경했지만

이미 id가 등록된 느낌으로 이미 존재하는 데이터라면서 등록할 수 없다는 에러메세지를 볼 수 있었다.

 

결국 파스칼케이스를 지키기 위해 QuotePdfPage라는 이름으로 새로 생성하고 붙여넣기를 한 다음

경로명에 들어가는 vf page 이름을 찾아서 수정했다.

 

벌써 2차과제를 하는 동기분이 계신데

2차과제는 2개의 org를 연결하는 작업을 진행해야 해서 로그인이 불편한데

CCDX: Switch Org를 사용할 경우 org연결을 걱정할 필요가 없었고

두개의 org에 인증을 해두고 편하게 변경하면 됐다.

 

이름 수정 완료 후 pmd를 실행했는데 아무 오류도 없어서 의아했는데

내가 이름을 다 잘 수정해서 문제가 없는건가? 하며 넘어가기에는

0개의 오류는 사실 존재할 수 없는 수치였다.

(주석도 달지 않은 상태)

 

결국 다시 제로에게 정상 상태인지를 질문했더니

주석등이 없는 경우에 돌아가서 0개일 수는 없다며

이런저런 세팅을 같이 보다가 가셨고

결론적으로 pmd는 확인하는 것은 아니기 때문에(규칙 체크)

자체적으로 주석까지 잘 마무리하기로 했다.

 

pmd 확인과 java 세팅 등 여러가지 시도를 하며 시간을 보내고

pdf 페이지를 잠깐 보여드렸는데 동기분들의 팁들이 나와서

다시 java와 vf page에서 제공하는 date, currency formatter를 검색하고 적용해보려고 했는데

안타깝게도 pmd를 확인하던 도중 먹통이 되어 고치는 동안 다시 주석쪽으로 넘어왔다.

 

주석을 완료하고 지나가던 회사분에게 질문하니

params는 매개변수로 들어온 값들만 넣어줘야 한다고 해서

줄지어 만들었던 값들을 제거했고 힘들게 만들었던 주석의 절반이 날아가버렸다.

(마치 타노스)

 

vfPage와 class만 주석이 있기 때문에 두개 모두 확인받아서 다행이었지만

주석은 보면 그냥 치면 되는 것이기 때문에 크게 중요한 것은 아니고

(저번 개발 설명 때 주석이 안되면 보지도 않는다고 해서 중요하다고 생각했는데 그냥 기본이었다)

테스트코드가 중요하다고 하셨는데

안타깝게도 테스트코드에는 아직 손도 대지 못했다.

 

이메일이나 로딩 스피너를 추가하려고 생각하고 있었는데

기본중에 기본인 pdf생성, 저장 기능을 완료했고

네이밍 규칙 전체 확인 및 주석까지 전부 달았기 때문에

내일은 테스트코드 작성을 진행해볼 것 같다.

(또는 pmd가 왜 안되는지 확인)

 

 

 

 

 

(1).백준 10474번 분수 좋아해는 두 개의 숫자를 받았을 때

a를 b로 나눈 경우 몫과 나머지 그리고 b를 출력하는 문제였다.

Math.floor와 %를 사용해 문제를 해결할 수 있었다.

const input = `27 12
2460000 98400
3 4000
0 0`.split('\n')

const result = []

for(let i = 0 ; i < input.length -1 ; i++){
    const[a,b] = input[i].split(' ').map(Number)
    result.push(`${Math.floor(a/b)} ${a%b} / ${b}`)
}

console.log(result.join('\n'))

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

[수습일지] - 39  (0) 2023.05.04
[수습일지] - 38  (0) 2023.05.03
[수습일지] - 36(근로자의 날)  (0) 2023.05.01
[수습일지] - 35(주말)  (0) 2023.04.30
[수습일지] - 34(주말)  (0) 2023.04.29

+ Recent posts