클로저란? : 함수와 함수가 선언된 어휘적 환경(Lexical Scope)의 조합

function add() {
    const a = 10
    function innerAdd() {
        // innerAdd() 은 내부 함수이며, 클로저다.
        const b = 20
        console.log(a + b);
    }
    innerAdd();
    }
add();

함수가 중첩된 상황에서 a 변수의 유효범위는 add 전체이고, b 변수의 유효범위는 innerAdd 전체이다.

선언적 어휘적 환경이란, 변수가 코드 내부에서 어디서 선언됐는지를 말하는 것이다.


변수의 유효범위, 스코프(Scope)

변수의 유효범위에 따라서 어휘적 환경이 결정된다. 이러한 변수의 유효 범위를 스코프(scope)라고 한다.

 

1. 전역 스코프(global)

이름에서 알 수 있듯, 이 스코프에서 변수를 선언하면 어디서든 호출 가능하다.

 

2. 함수 스코프(Function-level scope)

함수 스코프는 함수 내부에서 선언된 변수가 해당 함수 내부에서만 접근 가능한 의미한다.

, 함수 내부에서 선언된 변수는 함수 외부에서 접근할 없다.

function hello() {
  var local = 'local variable'
  console.log(local) // local variable
}

hello()
console.log(local) // ReferenceError

함수 내부에서 선언된 local 변수는 함수 내부에서 접근 가능하지만 함수 외부에서는 접근할 수 없다.

var x = 10

function foo() {
  var x = 100
  console.log(x) // 100

  function bar() {
    var x = 1000
    console.log(x) // 1000
  }
  bar()
}

console.log(x) // 10
foo()

중첩 되어있을 경우 가장 가까운 변수를 참조한다. 전역 스코프의 x는 전역 변수인 x를 참조하게 된다.


 

리액트에서의 클로저

클로저의 원리를 사용하고 있는 대표적인 것 중 하나는 useState이다.

function Component() {
  const [state, setState] = useState()
  function handleClick() {
    setState((prev) => prev +1)
  }
}

useState 함수의 호출은 첫 줄에서 종료되었지만,

useState 내부에서 클로저가 활용되었기 때문에 setState는 계속해서 최신 값을 확인할 수 있는 것이다.

 

handleClick 함수는 클로저를 사용하여 이전 상태를 참조하고, 상태를 업데이트 할 수 있다.

클로저를 통해 컴포넌트의 렉시컬 스코프에 접근할 있어, 상태 관리와 업데이트가 효과적으로 이루어질 있는 것이다.

클로저를 활용하면 전역 스코프의 사용을 막고, 개발자가 원하는 방향으로 정보를 노출시킬 수 있다는 장점이 있다.

 

axios 통신 도중 delete에서 계속 400 에러 발생

요청 바디에 { clubName: '동아리명' } 형태로 보내야하는데 에러가 찍히지만 내가 원하는대로 잘 보내지길래 왜이러지 ? 싶었다

보내는 방식은 post에 요청 바디 보낼 때와 동일한 형태로 보냈음.

근데 저 에러에서 clubName 밑에 data: undefined가 조금 꺼림직했다.

지피티 최고 ㅠ

혹시나 하는 마음에 지피티에게 물어보니

DELETE 요청을 보낼 때도 요청 바디를 포함시킬 수 있다
>> 요청 바디를 포함 시키려면 data 옵션을 사용하라. 고 했다 !!!

 

그래서 아래의 형태로 보냈었던 요청을

const result = await API().delete('/admin/club', { clubName: name })

 

data 옵션을 사용해서 한번 더 감싸서 보내주니 !!!!

const result = await API().delete('/admin/club', {data: { clubName: name }})

 

반갑다 200아 ㅠ 해결완료 !

 

리액트와 리액트 네이티브는 비슷한 듯 다르다.

핵심적으로 알아야할 컴포넌트들 비교하고 스타일링 적용하는 방법을 알아보자

<div>  VS  <View>

리액트의 <div></div>태그, 리액트 네이티브의 <View></View>태그의 용도는 같다.

하지만 주의해야할 점은

<div>안녕하세요</div>

div 태그 내 텍스트 안녕하세요 >> 가능

<View>안녕하세용</View>

View 태그 내 텍스트 안녕하세용 >> 불가능

에러남
Text 태그로 감싸주니 활용 가능

View
콘텐츠를 담는 상자나 컨테이너 구축에 사용됨.
다른 컴포넌트들을 담을 순 있지만 단순 텍스트를 담을 수 없다.

<Text> 태그로 감싸주면 활용 가능.


View : 컴포넌트를 담고 배치하는 컴포넌트

Text : 텍스트를 표시

Button : 버튼 등

다양한 핵심 컴포넌트들은 공식 홈페이지에서 찾아 활용하는 것을 추천

https://reactnative.dev/docs/components-and-apis

 

Core Components and APIs · React Native

React Native provides a number of built-in Core Components ready for you to use in your app. You can find them all in the left sidebar (or menu above, if you are on a narrow screen). If you're not sure where to get started, take a look at the following cat

reactnative.dev

리액트와 정말 비슷하다.


스타일 적용하는 방법

React Native는 CSS 지원하지 않음.

파일을 추가하거나 css 언어를 사용하지 않는다.

1. 인라인 스타일 추가해서 스타일 객체를 프로퍼티로 전달
2. 별도의 객체를 정의해서 프로퍼티로 전달

 

1. 인라인 스타일 방식

말 그대로 태그 안에 스타일을 적용하는 방식이다. 하지만 좋은 방식은 아니다.

jsx 코드와 스타일 코드의 구분이 명확하지 않기 때문. 가독성도 떨어짐.

 

2. 별도의 객체를 정의해서 프로퍼티로 전달

stylesheet 객체 사용,  JSX 코드와 스타일 코드를 명확히 구분해줌. 스타일 재사용 가능

dummyText라는 객체 안에 스타일을 정의해서 Text 태그의 프로퍼티로 전달한 것을 알 수 있다.

동일한 스타일을 두군데 작성하고 싶을 때 단순하게 프로퍼티만 전달하면 되기 때문에 그 부분에서도 간편하다.


꿀팁 사이트

색상 설정 및 사용하는 다양한 방식

https://reactnative.dev/docs/colors

 

Color Reference · React Native

Components in React Native are styled using JavaScript. Color properties usually match how CSS works on the web. General guides on the color usage on each platform could be found below:

reactnative.dev

컴포넌트가 지원하는 스타일 프로퍼티

https://reactnative.dev/docs/view-style-props 

 

View Style Props · React Native

Example

reactnative.dev


Flex Box

CSS에서 Flex Box 속성을 잘 아는 사람에게는 익숙할 것이다.

위에서 스타일을 적용하는 방식대로 적용하고, Flex를 사용해 레이아웃을 배치한다.

여기서 한가지 다른 점이 있다.

Flex의 기본 배치 방향은 Default가 row인데

리액트 네이티브에서는 특이하게도? Column 방향이 Default였다.

별도로 명시하지 않으면 View들이 세로로 쌓이는 것을 보면 이해가 되는 부분이다.

여기서 추가로 알아야할 점은 display:flex는 View의 기본 속성이라는 점이다.(기본 속성이 flex인 게 좀 신기하다.)

div 태그는 block 속성인데, View 태그는 Flex 속성인 것도 차이점으로 알아두면 좋을 것 같다.

그래서 별도의 스타일을 적용하지 않아도 Column 방향으로 정렬된다.

SearchContainer을 보면 기본으로 flex가 적용되어있으니 기본적으로 display: flex와 같은 스타일은 따로 지정해주지 않고

바로 배치방향을 가로 방향으로 변경했다. 그리고 다른 속성들 사용 방법은 동일하다.

굳이 다른 점은 스타일이 카멜케이스로 작성되어있다는 점이다.

이런 부분은 바로 눈에 보여서 리액트와 다르다는 것을 바로 알수 있는 부분이다.

 

리액트와 알게 모르게 다른 부분이 있어서 헷갈리는 부분이 있는 것 같지만,

리액트를 잘 다룰 줄 안다면 이런 주의사항만 잘 숙지해서 바로 개발에 들어가도 괜찮을 것 같다.

그리고 생각보다 차이점들을 하나 둘 씩 알아가는게 재밌는 것 같다.

 

리액트와 리액트 네이티브의 사용법 차이 위주로 헷갈리는 부분들을 중심으로 글을 작성해야겠다.

 

+ Recent posts