1. 설치

1.1 source.list 셋업

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

lsb_release는 리눅스 배포판 확인하는 명령어 옵션 -sc는 short와 codename으로써 간략하게 리눅스 배포판의 코드명만 출력

위에서 실행한 명령어 확인을 위해 /etc/apt/sources/list.d/ros-latest.list 파일에 리다이렉션해서 생성한 것이 정확히 되었나 확인하기.

 

1.2 key 셋업

$ sudo apt install curl   #curl이 설치가 안됐을 때만 해당
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

1.3 데비안 패키지 업데이트

$ sudo apt update

1.4 데스크탑용 ROS 설치 (시간이 조금은 소요되는 작업)

$ sudo apt install ros-noetic-desktop-full

1.5 환경 셋업

$ source /opt/ros/noetic/setup.bash

-shell이 bash일 경우

$ echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

-shell이 zsh일 경우

$ echo "source /opt/ros/noetic/setup.zsh" >> ~/.zshrc
$ source ~/.zshrc

!본인 쉘 학인하기

$ echo $SHELL
#작성자는 /bin/bash

 

1.6 패키지 빌드를 위한 종속성

지금까지 핵심 ROS 패키지를 실행하는데 필요한 것을 설치함. 본인만의 ROS 작업 공간을 만들고 관리하기 위해 별도로 배포되는 다양한 도구와 요구 사항이 있음.

$ sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

1.7 rosdep 설치(!1.6을 실행한 경우 1.7은 하지 않아도 됨)

ROS에서 다양한 툴으르 사용하려면, 'rosdep'가 필요함. rosdep는컴파일하려는 소스에 대한 시스템 종속성을 쉽게 설치할 수 있으며 ROS에서 일부 핵심 구성 요소를 실행하는 데 필요함.    

$ sudo apt install python3-rosdep

1.8 rosdep 초기화

$ sudo rosdep init
$ rosdep update

 

 

위의 포스팅은 ROS 공식 문서를 참조하여 한글화 한것임.

 

바로 이저의 게시글 des로 구현한 코드는 0으로 채워진 암호화를 복호화할 시 0이 없어진 상태로 복호화 되는 것이 아니라 0이 그대로 나타난다는 것이 문제점이며 이는 데이터 무결성을 보장하지 못한다는 뜻이다. 

복호화는 암호화된 암호문을 복호화시 원래의 평문과 동일함을 보장해야한다.

from Crypto.Cipher import AES
from Crypto.Hash import SHA256 as SHA

class myAES():
    def __init__(self, keytext, ivtext):
        hash = SHA.new()
        hash.update(keytext.encode('utf-8'))
        key = hash.digest()
        self.key = key[:16]

        hash.update(ivtext.encode('utf-8'))
        iv = hash.digest()
        self.iv = iv[:16]

    def makeEnabled(self, plaintext): #16바이트 배수가 아닐 경우 16바이트 배수로 만들어줌
        fillersize = 0
        textsize = len(plaintext)
        if textsize%16 !=0:
            fillersize = 16-textsize%16
        filler = '0'*fillersize
        header = '%d' %(fillersize)
        gap = 16 - len(header)
        header += '#'*gap

        return header+plaintext+filler

    def enc(self, plaintext):
        plaintext = self.makeEnabled(plaintext)
        aes = AES.new(self.key, AES.MODE_CBC, self.iv)
        encmsg = aes.encrypt(plaintext.encode())
        return encmsg
    
    def dec(self, ciphertext):
        aes = AES.new(self.key, AES.MODE_CBC, self.iv)
        decmsg = aes.decrypt(ciphertext)

        header = decmsg[:16].decode()
        fillersize = int(header.split('#')[0])  

        if fillersize != 0:
            decmsg = decmsg[16:-fillersize]
        else:
            decmsg = decmsg[16:]
        return decmsg
    
def main():
    keytext = 'samsjang'
    ivtext = '1234'
    msg = 'python3x'

    myCipher = myAES(keytext, ivtext)
    ciphered =  myCipher.enc(msg)
    deciphered = myCipher.dec(ciphered)
    print('ORIGINAL:\t%s' %msg)
    print('CIPHERED:\t%s' %ciphered)
    print('DECIPHERED:\t%s' %deciphered)

main()

DES 코드와 많이 달라 진 것은 없다. 다만 makeEnabled()함수를 잘 이해하고 넘어가야한다. 인자로 입력되는 plaintext의 크기가 16바이트 배수가 아닐 경우 문자 '0'을 plaintext 끝에 추가하여 16바이트 배수로 만들고, 이에 대한 정보를 헤더로 구성한 후 결과를 리턴한다.

헤더 크기는 16바이트로 한다. 예로 plaintext를 16바이트 배수로 만들기 위해 추가된 '0'을 개수가 12일 경우 헤더는 다음과 같이 구성된다. header = '12##############'로 총 '#'문자가 총 14개로 구성된다.  makeEnabled()로 plaintext를 "헤어+원래 정보+'0'문자열"로 변환한다.

 

그리고 split 부분 맨 뒤 [0] 인덱스가 무엇을 의미하는 지 몰라서 파이썬 idle에 실행 해보았는데 파이썬 split()함수를 사용하면 다음과 같이 자료형이 list로 반환된다. 애석하기도 이거 하다가 처음 알았음;;;;

 

split으로 '#'을 구분자로 분리하고, 분리된 값 중 첫 번째를 정수로 변환하여 변수 fillersize에 할당한다.

fillersize는 원래 정보 뒤에 추가한 문자 '0'의 개수이므로 decmsg를 16에서 -fillersize까지 슬라이싱하면 원래 정보가 추출된다.

 

출처: 화이트 해커를 위한 암호와 해킹

3DES CBC 모드로 암호화하고, 암호화된 문장을 3DES로 복호화하는 코드

 

CBC모드란 블록을 암호화하기 전에 이전 블록의 암호화된 블록과 XOR연산을 한 결과를 새로운 암호키로 해서 블록을 암호화하는 방식이다. 맨 첫 블록은 이전 블록이 없기 때문에 이전 블록 역할을 하는 초기화 벡터가 필요하다.

from Crypto.Cipher import DES3
from Crypto.Hash import SHA256 as SHA

class myDES():
    def __init__(self, keytext, ivtext):  #keytext는 암호키 생성, ivtext는 초기화 벡터를 위한 문자열
        hash = SHA.new()    #SHA256객체 만들고 hash에 할당
        hash.update(keytext.encode('utf-8'))    #SHA256해시 갱신
        key = hash.digest()    #hash값 추출한후 key에 할당
        self.key  = key[:24]   #24바이트만큼 슬라이싱

        hash.update(ivtext.encode('utf-8'))
        iv = hash.digest()
        self.iv = iv[:8]

    def enc(self, plaintext):     #암호화
        plaintext = make8String(plaintext)
        des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)
        encmsg = des3.encrypt(plaintext.encode())   
        return encmsg
    
    def dec(self, ciphertext):    #복호화
        des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)
        decmsg = des3.decrypt(ciphertext)
        return decmsg
#DES3.new()의 인자는 순서대로 '암호키', '운영모드', '초기화 벡터'순
#운영 모드에 따라서 초기화 벡터가 있을 수도 있고 없을 수도 있다.


def make8String(msg):       #암호화하려는 메시지 길이가 8바이트 배수가 아닌 경우 8바이트 배수로 
    msglen = len(msg)
    filler = '' 
    if msglen%8 != 0:
        filler = '0'*(8-msglen%8)
    msg += filler
    return msg

def main(): 
    keytext = 'keyisimportant'
    ivtext = '1234'
    msg = 'python3xab'

    myCipher = myDES(keytext, ivtext)
    ciphered = myCipher.enc(msg)
    deciphered = myCipher.dec(ciphered)

    print('ORIGINAL:\t%s' %msg)
    print('CIPHERED:\t%s' %ciphered)
    print('DECIPHERED:\t%s' %deciphered)

main()

myDES클래스에서 keytext인자와 ivtext인자를 utf-8로 인코딩하는 것은 파이썬3에서 UTF-8로 인코딩된 문자열은 문자열이 아니라 이진데이터가 연속적으로 있는 바이트 스트림으로 취급하기 때문이다.

Pycryptodome에서 제공하는 3DES의 크기는 16바이트 또는 24바이트 크기, 초기화 벡터의 크기는 8바이트이므로 암호화하려는 문자열의 배수가 8바이트의 배수여야 한다. 그렇지 않으면 암호화가 되지 않기 때문에 make8String 함수를 만들어 8바이트의 배수가 아닌경우에도 암호화가 되게 한다.

 

결과에서 b'로 표시된 것은 문자열이 아닌 바이트 객체라는 것을 나타낸다.

 

 

출처: 화이트 해커를 위한 암호와 해킹

주상 전치 암호는 특정 개수 열로 평문 문장을 배열한 후, 열 방향으로 문장을 읽어 암호문을 구성하는 암호화 방법이다.

여기서 중요한 것은 읽어 들이는 열의 순서

 

만약 암호키가 'BRAIN'인 경우 암호크 크기는 5이므로 평문 배열은 5열로 구성하고 'B','R','A','I','N'의 상대적인 순서는 2,5,1,3,4이다.

 

B  R  A  I  N

2  5  1  3  4

A  B  C  D  E

F  G  H   I  J

K  L  M  N  O

P  Q  R  S  T

 

각 열에 배열된 문자 개수는 4개이다. 이 숫자를 앞으로 암호 블록 크기라고 부른다.

배열된 문장의 각 열을 읽는 순서는 1열부터 5열까지 각각 2,5,1,3,4이므로, 이 순서로 각 열을 읽어 암호문을 만들면 'CHMR AFKP DINS EJOT BGLQ'로 암호화가 된다. (당연히 생성된 암호문에서 공백을 제거한 후가 최종 암호문)

 

ENC = 0
DEC = 1

def parseKey(key):
    key = key.upper()
    tmp = []

    for i, k in enumerate(key):
        tmp.append((i, k))

    tmp = sorted(tmp, key = lambda x: x[1])

    enc_table = {}
    dec_table = {}

    for i, r in enumerate(tmp):
        enc_table[r[0]] = i
        dec_table[i] = r[0]

    return enc_table, dec_table


def transposition(msg, key, mode):
    msgsize = len(msg)
    keysize = len(key)
    ret = ''

    filler = '' 
    if msgsize%keysize != 0:        #보다 쉬운 프로그래밍을 위해 평문이 키크기의 배수가 아닐시 배수가 되도록 평문의 끝에 문자 '0'으로 채우기
        filler = '0'*(keysize - msgsize%keysize)

    msg = msg.upper()   
    msg += filler

    enc_table, dec_table = parseKey(key)

    if mode == ENC:
        table = enc_table
    else:
        table = dec_table
    
    if mode == ENC:
        buf = ['']*keysize
        for i, c in enumerate(msg):
            col = i%keysize
            index = table[col]
            buf[index] += c
        
        for text in buf:
            ret += text
      
    
    else:
        blocksize = int(msgsize/keysize)
        buf = ['']*keysize
        pos = 0
        for i in range(keysize):
            text = msg[pos:pos+blocksize]   #암호문 블록크기만 큼 자름 [0:4], [4:8],..
            index = table[i]
            buf[index] += text
            pos += blocksize
        
        for i in range(blocksize):
            for j in range(keysize):
                if buf[j][i] != '0':
                    ret += buf[j][i]
    return ret


def main():
    key = 'BRAIN'   
    msg = 'TREASUREBOXISBURRIEDATTWOHUNDREDFEETTONORTHEASTAWAYFROMYOURHOME'
    print('Original:\t%s' %msg.upper()) 

    ciphertext = transposition(msg, key, ENC)
    print('Ciphered:\t%s' %ciphertext)

    deciphertext = transposition(ciphertext, key, DEC)
    print('Deciphered:\t%s' %deciphertext)


if __name__ == '__main__':
    main()

 

 

출처: 화이트 해커를 위한 암호화 해킹

알파벳 A~Z까지 총 26개이다. 인덱스는 0부터 25

암호키 인덱스 k, 원래 문장의 문자 인덱스 i, 바뀐 문장의 문자 인덱스 Enc(i)

Enc(i)  = (i+k)mod26

mod는 (i+k)를 26으로 나눈 나머지이다. 위의 식을 카이사르 문자변환식이라고 한다.

 

만약 암호키가 C이면 암호키 인덱스는 k=2이다.

그러면 Enc(i) = (i+2)mod26 이 된다.

문자 A의 인덱스 i=0일 때, Enc(i)는 2mod26이므로 값은 2, 2의 인덱스는 C이다. 고로 A는 C로 암호화 되는 것이다.

 

카이사르 암호 도구 구현하기

ENC = 0
DEC = 1

def makeDisk(key):
    keytable = map(lambda x: (chr(x+65), x), range(26))

    key2index = {}  

    for t in keytable:
        alphabet, index = t[0], t[1]    
        key2index[alphabet] = index

    if key in key2index:        #k는 입력한 키에 해당하는 인덱스
        k = key2index[key]
    else:
        return None, None

    enc_disk = {}
    dec_disk = {}

    
    for i in range(26): 
        enc_i = (i+k)%26    #enc_i
        enc_ascii = enc_i + 65  #0~25부터 enc_i에 해당하는 아스키 코드
        enc_disk[chr(i+65)] = chr(enc_ascii)
        dec_disk[chr(enc_ascii)] = chr(i+65)    

    return enc_disk, dec_disk

def caesar(msg, key, mode):
    ret = ''
    key = key.upper()
    msg = msg.upper()
    enc_disk, dec_disk = makeDisk(key)

    if enc_disk is None:
        return ret

    if mode is ENC:
        disk = enc_disk 
    if mode is DEC:
        disk = dec_disk

    for c in msg:
        if c in disk:
            ret += disk[c]
        else:
            ret += c
    
    return ret

def main():
    plaintext = 'ilovepython'
    key = 'i'

    print('Original:\t%s' %plaintext.upper())
    ciphertext = caesar(plaintext, key, ENC)
    print('Caesar Cipher:\t%s' %ciphertext)
    deciphertext = caesar(ciphertext, key, DEC)
    print('Deciphered:\t%s' %deciphertext)

if __name__ == '__main__':
    main()

사용자가 입력하는 키로는 알파벳만 사용된다. 숫자는 허용되지 않음

keytable에서 [(알파벳, 인덱스)]

key2index에서 {알파벳: 인덱스}

 

 

출처: 화이트 해커를 위한 암호화 해킹

작년 그니까 2학기 때 정보보안 수업 기말과제 였던 sdes 암호 알고리즘을 자바로 짰다.

 

키 값은 0~1023까지 입력 가능하며 암호화는 알파벳 A~Z, a~z까지 한 문자만 받을 수 있음

키 생성과 암호화, 복호화 버튼 모두 클릭 시 세부사항 버튼이 활성화 됨

 

클래스는 총 4개로 구성

- Test 클래스

프로그램 실행 시 제일 처음 보이는 UI의 클래스

 

- Details 클래스

세부사항 버튼 클릭 시 나타나는 화면의 UI 클래스

 

- S_DES 클래스

프로그램에서 제일 핵심적인 s-des 알고리즘이 코드로 구현 되어 있는 클래스

 

- Main 클래스

본 프로그램의 메인 클래스

S-DES 클래스 알고리즘

package simple;


public class S_DES {
	
	int tmp[] = new int[10];

	int tmp2[]  = new int[10];

	int tmp3[] = new int[10];

	int input[] = new int[10];

	int k1[] = new int[8];

	int k2[] = new int[8];

	int right[] = new int[4];
	
	int tot = 0;
	
	int d = 1;
	
	int a, b;

	int index = 0, row = 0, col = 0;

	int p10[] = {3, 5, 2, 7, 4, 10, 1, 9, 8, 6};

	int p8[] = {6, 3, 7, 4, 8, 5, 10, 9};

	int ip[] = {2, 6, 3, 1, 4, 8, 5, 7};

	int ep[] = {4, 1, 2, 3, 2, 3, 4, 1};

	int s0[][] = {{1, 0, 3, 2},

			{3, 2, 1, 0},

			{0, 2, 1, 3},

			{3, 1, 3, 2}};

	int s1[][] = {{0, 1, 2, 3},

			{2, 0, 1, 3},

			{3, 0, 1, 0},

			{2, 1, 0, 3}};

	int p4[] = {2, 4, 3, 1};

	int ip1[] = {4, 1, 3, 5, 7, 2, 8, 6};

	int deci;

	int [] digits;

 
	int dep10[] = new int[10];
	
	int oneshift[] =  new int[10];
	
	int twoshift[] = new int[10];
	
	int dep8[] = new int[8];
	
	public void key_generation() {

		//Permutation10

		for(int i = 0; i < 10; i++) {

			index = p10[i];

			tmp[i] = input[index-1];

		}
		
		for(int i=0; i<10; i++)
			dep10[i] = tmp[i];

		//P10 left shift

		a = tmp[0]; b = tmp[5];
		
		for(int i = 0; i < 5; i++) {
			if(i == 4) {

				tmp[4] = a;

				tmp[9] = b;

			}

			else {

				tmp[i]=tmp[i + 1];

				tmp[i + 5] = tmp[i + 6];

			}
			
		}
		
		for(int i=0; i<10; i++)
			oneshift[i] = tmp[i];
 
		
		//afterP8 key1 generation

		for(int i = 0; i < 8; i++) {

			index = p8[i];

			k1[i] = tmp[index-1];

		}

 
		//left shift by2 key2 generation

		for(int j = 0; j < 2; j++) {

			a = tmp[0]; b = tmp[5];

			for(int i = 0; i < 5; i++) {

				if(i == 4) {

					tmp[4] = a;

					tmp[9] = b;

				}

				else {

					tmp[i]=tmp[i + 1];

					tmp[i + 5] = tmp[i + 6];

				}

			}

		}
		
		for(int i=0; i<10; i++)
			twoshift[i] = tmp[i];

		for(int i = 0; i < 8; i++) {

			index = p8[i];

			k2[i] = tmp[index-1];

		}

	}

	//IP(8)

	public void ip() {

		for(int i = 0; i < 8; i++) {

			index = ip[i];

			tmp[i] = input[index-1];

		}

		for(int i=0; i<8; i++)
			dep8[i]=tmp[i];

	}


	//E/P

	public void ep() {

		for(int i=0; i<4;i++)

			right[i]=tmp[i+4];

		

		for(int i = 0; i < 8; i++) {

			index = ep[i];

			tmp2[i] = right[index-1];

		}

	}

	

	//k1과 E/P_output XOR

	public void xor_k1() {

		for(int i = 0;i < 8;i++) {

			index = tmp2[i]^k1[i];

			tmp3[i] = index;

		}

	}

 

	public void s_box() {

		row = tmp3[0]*2 + tmp3[3];

		col  = tmp3[1]*2 + tmp3[2];


		index = s0[row][col];

//		System.out.println("s0 index:" + index);

		tmp2[0] = index/2;

		tmp2[1] = index%2;

 

		row = tmp3[4]*2 + tmp3[7];

		col  = tmp3[5]*2 + tmp3[6];

		

		index = s1[row][col];

//		System.out.println("s1 index: "+index);

		tmp2[2] = index/2;

		tmp2[3] = index%2;	

	}

 

	public void p4() {

		for(int i = 0; i < 4;i++) {

			index = p4[i];

			tmp3[i] = tmp2[index-1];

		}

	}

 

	public void ipXORp4() {

		for(int i = 0; i < 4; i++) {

			index = tmp[i] + tmp3[i];

			if(index == 1)

				tmp2[i] = 1;

			else

				tmp2[i] = 0;

		}

	}

	public void sw() {

		for(int i = 0; i<8; i++) {

			if(i<4)

				tmp[i] = tmp[i+4];

			else

				tmp[i] = tmp2[i-4];

		}
	}

	
	public void xor_k2() {

		for(int i=0;i<8;i++) {

			index = tmp2[i]^k2[i];

			tmp3[i] = index;

		}	

	}

 

	public void ip_1() {

		for(int i =0;i<4;i++) 
			tmp[i] = tmp2[i];
		

		for(int i =0;i<8;i++) {
			index=ip1[i];
			tmp3[i]=tmp[index-1];

		}

	}
	
	public void changedecimal() {
		for(int i=7; i>=0; i--) {
			tot = tot + (d*tmp3[i]);
			d = d * 2;
		}
	}


	public void tenbit() {
		String result = "";
		
		String fina2;
		
		for(int i=deci; i>0; i/=2) 
			result = String.valueOf(i%2) + result;

		int fina = Integer.parseInt(result);

		fina2 = String.format("%010d", fina);

		digits = new int[fina2.length()];

		for( int i = 0; i < fina2.length(); i++)
			digits[i] = fina2.charAt(i) - '0';
	
	}
}

언어: 자바

에디터: 이클립스

 

르그랑 코드북을 참조해서 파일 암호화하기

현재는 전혀 쓰이지 않는 르그랑 코드북을 참조한 암호알고리즘이다.

 

def makeCodebook():                         #르그랑 코드북 참조
    decbook ={'5':'a', '2':'b', '#':'d', '8':'e', '1':'f', '3':'g', '4':'h', '6':'i', '0':'l', '9':'m',\
    '*':'n', '%':'o', '=':'p', '(':'r', ')':'s', ';':'t', '?':'u','@':'v',':':'y', '7':' '}  #복호화 할때 쓰일 코드북

    encbook = {}            #암호화 할때 쓰일 코드북

    for k in decbook:       #debcook의 key와 value 값을 바꾸어서 encbook을 만듦
        tmp = decbook[k]    
        encbook[tmp] = k
    
    return encbook, decbook     #반환값 순서대로 encbook, decbook   

def encrypt(msg, encbook):      #암호화 로직
    for c in msg:
        if c in encbook:
            msg = msg.replace(c, encbook[c])
    return msg

def decrypt(msg, decbook):      #복화화 로직
    for c in msg:
        if c in decbook:
            msg = msg.replace(c, decbook[c])
    return msg


def main():
    h = open('plain.txt', 'rt')     #plain.txt라는 파일을 텍스트 읽기모드로 염
    content = h.read()
    h.close()

    encbook, decbook = makeCodebook()
    content = encrypt(content, encbook)

    h = open('encryption.txt', 'wt+')      #암호화 한것을 encryption.txt 파일에 텍스트 쓰기모드로 염
    h.write(content)
    h.close()
  
if __name__ == '__main__':
    main()

 

암호화 전의 평문 텍스트 파일 plain.txt

For seven days and seven nights
Man will watch this awesome sight.
The tides will rise beyond their ken
To bite away the shores and then
A fiery dragon will cross the sky
Six times before this earth shall die
Mankind will tremble and frightened be
for the sixth heralds in this prophecy.
The great star will burn for seven days,
The cloud will cause two suns to appear
The big mastiff will howl all night
When the great pontiff will change country.

 

암호화 된 텍스트 파일 encryption.txt

F%(7)8@8*7#5:)75*#7)8@8*7*634;)
M5*7w6007w5;c47;46)75w8)%987)634;.
T487;6#8)7w6007(6)8728:%*#7;486(7k8*
T%726;875w5:7;487)4%(8)75*#7;48*
A7168(:7#(53%*7w6007c(%))7;487)k:
S6x7;698)7281%(87;46)785(;47)45007#68
M5*k6*#7w6007;(8920875*#71(634;8*8#728
1%(7;487)6x;4748(50#)76*7;46)7=(%=48c:.
T4873(85;7);5(7w60072?(*71%(7)8@8*7#5:),
T487c0%?#7w6007c5?)87;w%7)?*)7;%75==85(
T487263795);6117w60074%w075007*634;
W48*7;4873(85;7=%*;6117w6007c45*387c%?*;(:.

언어 파이썬(python)3.x

에디터 vscode

 

출처: 화이트 해커를 위한 암호화 해킹

  • 컴포넌트란¿

컴포넌트는 Angular의 핵심구성요소로서 Angular 애플리케이션은 컴포넌트를 중심 CBD, Component Vased Development으로 구성된다. 컴포넌트의 역할은 애플리케이션의 화면을 구성하는 뷰View를 생성하고 관리하는 것이다.

컴포넌트는 독립적이고 완결된 뷰를 생성하기 위하여 "HTML, CSS, 자바스크립트를 하나의 단위로 묶는 것"

 

  • 컴포넌트의 기본 구조

생성된 루트 컴포넌트 src/app/app.component.ts

app.component.ts

컴포넌트는 1)임포트 영역과 2)@Component 데코레이터 영역 3)컴포넌트 클래스 영역으로 구분할 수 있다.

 

임포트 영역

컴포넌트에 필요한 의존 모듈을 임포트한다. 

 

@Component 데코레이터 영역

@Component 데코레이터에는 메타데이터 객체를 인자로 전달한다. 메타데이터 객체는 컴포넌트 생성에 필요한 정보(셀렉터, 템플릿, 스타일 정의 등)를 담고 있다.

 

컴포넌트 클래스 영역

컴포넌트 뷰를 관리하기 위한 로직을 담은 클래스를 정의한다. 컴포넌트 클래스는 컴포넌트의 내부 관심사인 뷰의 관리에 집중해야 하며 애플리케이션 공통 관심사는 서비스로 분리하여야 한다.

 

주의해야 할 것은 @Componenet 데코레이터 바로 아래에는 반드시 컴포넌트 클래스를 위치시켜야 한다는 점이다. @Component 데코레이터는 자신의 바로  아래에 위치한 클래스를 컴포넌트 클래스로 인식한다. 따라서 데코레이터와 데코레이터가 장식하는 클래스 사이에는 아무것도 존재해서는 안 된다.

 

 

출처 : Angular Essentials

'Angular' 카테고리의 다른 글

Angular CLI  (0) 2021.08.29

+ Recent posts