출처: WowUIDev 디스코드
블리자드가 애드온 개발자들에게 새로 추가된 비밀값 secret value API에 관한 설명서를 보냈었습니다. 전문은 첨부 파일을 읽으면 됩니다.
서두에 먼저 말하자면 프로그래밍 지식이 필요합니다. 괄호 안에는 보다 이해하기 쉬운 말로 썼는데, 보다 정확한 이해를 하려면 본문을 읽으시기 바랍니다. 이 글의 목적은 애드온 변경 사항을 평가하려는 것이 아닌, 애드온 제작에 도움이 되기 위해서입니다.

전체적인 목표와 집중점
이번 API 변화의 전체적인 목표는, 애드온이 전투 정보를 기반으로 한 복잡한 논리적 계산을 하고, 최종적으로 플레이어의 생각과 판단을 요구하는 문제를 대신 해결하는 기능을 제한하는 것입니다. 
하지만 이에 못지 않게 중요하게도, 2차적인 목표는 바로 애드온이 전투 관련 UI를 포함한 UI의 모습과 느낌을 커스텀하는 기능을 유지시키는 것입니다. 
그래서 대부분의 전투 관련 API는 모종의 방법으로 영향을 받은 건 맞지만, 그렇다고 저희가 모든 API를 제한한다거나, UI를 애드온으로 접근할 수 없는 보안 환경으로 빼돌리겠다는 뜻은 아닙니다. 대신 이제 비밀값이라는 새로운 기술을 도입합니다. 
(애드온이 본래 사람이 해야 할 것을 자동으로 처리하는 기능을 없애겠다)
(그래도 여전히 UI를 커스텀하는 기능은 남겨두겠다)
(전투 관련 API는 거의 다 변경됐고, 유저가 애드온으로 커스텀하는 걸 허락하는 데이터들은 이제 비밀값이라는 새로운 기술을 써서 얻어야 한다)


새로운 Wow Lua 구조: 비밀값
비밀값을 쉽게 설명하자면 일종의 블랙 박스라고 생각하면 됩니다. 박스 안에는 임의 타입의 Lua 값이 들어 있습니다. 비 보안 코드, 즉 애드온 코드는 저희의 API를 통해 비밀값을 얻고 다른 API에 넘길 수 있습니다. 하지만 실제로 박스를 열어 안에 있는 값을 볼 수 없습니다.
비밀값을 다른 값과 비교하거나 연산을 하면 에러가 발생합니다. 보안 코드는 이러한 제한 없이 지금처럼 자유롭게 사용합니다. 비밀값을 반환하는 API는 Lua API 개발 문서에 있습니다. 또한 issecretvalue API로 직접 확인할 수 있습니다.
( 이제 비밀 데이터는 애드온에서 무엇과 비교하거나 더하기 빼기를 할 수 없다.
애드온이 아닌 공식 코드는 그러한 제한이 없다.
무엇이 비밀값인지는 확인해라. )

(스크립트 오브젝트란? Lua코드로 수정 혹은 생성한 모든 UI 요소는 전부 스크립트 오브젝트입니다. 단순한 코드적인 것이 아니라 실제로 눈에 보이는 것도요.) 
비밀값을 스크립트 오브젝트 API에 전달하기
위에서 말했듯이 애드온 코드는 비밀값을 API로 전달하는 것이 가능합니다. 스크립트 오브젝트 API도 여기에 포함됩니다. 하지만 비밀값을 스크립트 오브젝트 API로 전달하면, 그 오브젝트도 이제 비밀로 표시됩니다.
비밀로 표시되면 무슨 일이 발생하나요? 쉽게 말해서 그 API도 이제 일부 데이터를 비밀값으로 반환하기 시작합니다. 그 외에는 아예 접근이 불가능해집니다.
예시로 SetTexture API를 들어봅니다. 어떤 API로 어느 주문 아이콘의 파일 아이디fileID를 비밀값으로 얻었습니다. 애드온은 이  파일의 아이디를 어떤 텍스처의 SetTexture API로 넘길 수 있습니다. 하지만 그러면 그 텍스처의 GetTexture도 비밀값이 됩니다. 
오브젝트가 비밀로 표시됐는지 확인하려면 HasSecretValues를 호출하면 됩니다.

(애드온 코드는 비밀값을 다른 API에 전달을 가능함.
그래서 애드온은 현재 데이터가 뭔지는 몰라도 일단 UI 어느 곳에다가 적용을 할 수는 있음.
하지만 그러면 적용된 UI가 비밀로 표시됨. 이제 그 UI에서 특정 데이터를 받을 때도 비밀값으로 받음.
예시로 어떤 주문 아이콘의 파일 ID를 비밀값으로 얻었음. 이걸로 내 애드온의 어떤 빈 칸에 아이콘 그림을 적용하려고 함. SetTexture로 비밀값을 넘겨서 빈 칸에 파일ID에 맞는 아이콘 그림이 그려짐.
근데 그 빈 칸에 그려진 아이콘 그림이 뭔지 알려고 GetTexture를 하면, 빈 칸 자체가 비밀로 표시되었기 때문에 GetTexture로 얻은 값도 비밀값이기 때문에 확인이 불가능.
쉽게 말해서 이러쿵저러쿵 우회해서 비밀 세탁은 불가능하다라는 뜻.)


비밀 모음 Secret Aspects
위에서 주의하셨을 지도 모르지만
비밀로 표시되면 무슨 일이 발생하나요? 쉽게 말해서 그 API도 이제 일부 데이터를 비밀값으로 반환하기 시작합니다. 그 외에는 아예 접근이 불가능해집니다.
왜 "모든 데이터"가 아니라 "일부 데이터"라고 말했을까요?  그건 비밀 모음이라는 스크립트 오브젝트 구조 때문입니다. 비밀 모음을 쉽게 이해하려면, 해당 오브젝트에 속해있는 서로 연관된 API들의 모음이라고 생각하면 됩니다. 비밀 모음에 속한 API에 비밀값을 전달하면, 해당 오브젝트는 그 비밀 모음에 의한 비밀 표식이 생깁니다. 그러면 해당 비밀 모음의 API들은 비밀값을 반환하기 시작합니다.
예를 들면 어떤 스크립트 오브젝트가 보여졌는지 안 보여졌는지 나타내는 API SetShown, IsShown, IsVisible이 있습니다. 이 3개는 모두 Shown 비밀 모음에 속했습니다. 그래서 만약에 SetShown에 비밀값을 전달하면, 이 오브젝트는 Shown 비밀 모음에 의한 비밀 표식이 생기고, IsShown과 IsVisible도 비밀값을 반환하기 시작합니다. 

(예를 들어봅시다.
저는 어떤 메시지를 화면 중앙에 만들었습니다. 이 메시지의 목적은 내가 펫이 있는지 없는지 알려주는 것입니다.
펫의 유무는 비밀값입니다. 쓸 수는 있지만 연산과 비교가 불가능합니다.
애드온 코드 안에서 "펫이 없으면 경고 메시지 띄워줘"에서, "없으면"이라는 조건은 false와 비교를 해야 하므로 안됩니다.
그래서 단순하게 SetShown(펫의 유무 상태) API를 메시지에 전달합니다.
애드온 코드에서는 실제 유무 상태를 모르지만, API를 받은 보안 코드 측에서는 알기 때문에, 펫이 있으면 SetShown이 true가 되므로 메시지가 나타납니다. 펫이 없으면 false가 되므로 메시지가 사라집니다.(아직 알파 테스트 권한이 없어서 !로 비밀 boolean을 반전 가능한지 모르겠습니다)
그런데 이 메시지가 보여지고 있는지 알고 싶다면, IsShown을 써야 하는데, 같은 비밀 모음에서 비밀값이 전달 됐음으로, 애드온 코드로는 모릅니다.
근데 이러면 정작 펫이 없을 때 경고가 안 뜨게 됩니다. 그러면 어떻게 할까요? 펫이 없을 때 굉장히 눈에 띄는 UI 요소를 지우게 설정하면 됩니다. SetShown을 예를 들면 미니맵에 지정해서, 미니맵이 사라지면 내 펫이 죽은 것을 알 수 있습니다.)

비밀 모음은 여러 종류가 있고, 모음끼리 비밀 표시 상태를 공유하지 않습니다. 그래서 어떤 오브젝트가 Shown 비밀 모음으로 표시되어도, Alpha 모음에 속한 API가 비밀이 되지는 않습니다. API와 오브젝트는 동시에 여러 종류의 모음으로부터 비밀로 표식 될 수 있습니다. 
주의할 점은 비밀 모음으로 표식 된 오브젝트는 모든 게 비밀이 되지는 않습니다 (반대도 마찬가지로, 오브젝트가 비밀이 되어도 그 비밀 모음이 모두 비밀이 되는 건 아닙니다). 오브젝트가 비밀 모음으로 표식 됐는지는 HasSecretAspect 로 알 수 있습니다.
(비밀 모음은 오브젝트의 비밀 상태와 독립적으로 존재하는 개념, 내가 지금 다루는 데이터가 비밀인지 아닌지는 계속 확인해야 한다.
비밀 오브젝트 = 이 오브젝트를 통해서 얻는 데이터 중, 비밀 모음에 속해 있지 않는 것들은 비밀값임. 비밀 모음에 속해 있는 건 따로 봐야함.
xxx 비밀 모음으로 표시된 오브젝트 = xxx모음에서 얻는 건 모두 비밀값임. 나머지는 비밀값 아님.
모든 비밀 모음이 비밀로 표시된 오브젝트 = 비밀 오브젝트
)


비밀 고정점 Secret Anchors
스크립트 오브젝트가 비밀로 표시되면, 비밀 고정점도 얻게 됩니다. 오브젝트가 비밀 고정점을 가지게 되면, 오브젝트의 위치 API는 더 이상 애드온 코드에서 접근할 수 없습니다. 다른 API와 달리, 비밀 고정점은 이 오브젝트에 의존하는 다른 UI 프레임에도 전염됩니다. 그래서 프레임 B가 프레임 A위치에 의존하고, 프레임 A가 비밀 고정점이 있다면, 프레임 B도 비밀 고정점을 얻습니다. 
비밀 고정점은 경로에 따라 쭉 밑으로 전파됩니다. 하지만 위로는 전파되지 않습니다. 즉 프레임 A가 프레임 Z의 아래에 있다면, 프레임 Z는 A로 인해 비밀 고정점이 생기지 않습니다.
오브젝트가 비밀 고정점이 있는지는 IsAnchoringSecret로 알 수 있습니다.
(비밀 오브젝트, 즉 비밀값을 반환하는 UI의 경우 그 위치도 비밀값이 된다. 그 UI에 속해 있는 다른 UI의 위치도 비밀값이 된다.) 



비밀 지우기
비밀 상태와 비밀 모음이 비밀로 표시 됐을 때, SetToDefaults로 비밀을 취소하고 최초 상태로 돌려놓을 수 있습니다.
(상태 리셋용) 


조건부 비밀
일부 API는 특정 조건에서 비밀값을 반환합니다.
이런 API는 특수한 비밀 예측 태그로 표시되었고, 어떤 조건에서 바뀌는지 알려줍니다. 예를 들면 SecretWhenInCombat 처럼입니다. 이것은 또한 이벤트 로그에도 적용됩니다.
( 예를들면 이번에 채팅 메시지를 인스턴스 안에서는 비밀값으로 설정하려 했다가, mdt mrt도 못 쓰게 되어서 쐐기 중에서만 비밀, 보스전 중에서만 비밀 같은 조건으로 수정했습니다.)


추가)
비밀값으로 설정된 데이터들.
1. 캐릭터(플레이어, npc, 펫, 보스, 아군, 주시 대상 등등 모두) 이름
2. 캐릭터 체력
3. 캐릭터 자원
4. 캐릭터 ID
5. 캐릭터 종류(야수, 인간형,용족 등)
6. 앞으로 받을 치유량, 흡수될 치유량
7. 거리
8. 주문 시전 
9. 쿨타임
추가로 확인된 비밀값
1. 오라 정보(전투 중 비밀), 즉 캐릭터에 걸린 버프/디버프의 정보
2. 캐릭터의 클래스(전투 중 비밀)


이것들은 UI를 바꿀 수 있지만, 예를 들면
"내 대상 이름이 xxx면 알려줘"
"내가 앞으로 받을 치유량이 초과 치유될 지 알려줘"
"대상이 특정 주문 시전하면 경고해줘"
"내 쿨타임이 다 찼으면 경고음 틀어줘"
같이 조건문이나 계산은 어려울 거임.

이 외에 "혹시 이런 애드온 가능할까요?"같은 질문을 댓글에 쓰시면 답변해드리겠습니다.