반응형
** 개인 도메인을 가비아 혹은 카페24 혹은 그외 사이트에서 구매하여 가지고 있어야 합니다 
** 저의 프로젝트 기준이므로 꼭 사전에 Elb를 설정해주세요 !

 

aws Route 53 메뉴로 이동하여 호스팅영역으로 이동하여, [호스팅 영역 생성] 버튼을 클릭해줍니다.

 

가지고계신 도메인 이름을 입력 후 [호스팅 영역 생성] 버튼을 클릭합니다.

 

 

자, 이제 여러분의 호스트가 등록이 되었습니다.

아래 이미지의 dns정보를, 여러분이 사용하는 호스팅 사이트의 dns에 추가 해주세요 !
(아래 URL의 우선순위를 높여서 등록해주세요 ~)

 

 

 

DNS 정보를 등록하였다면 이제 직접적으로 사용자들이 접근할 서브 도메인을 만들어보죠 ~

 

서브도메인의 경우 가지고있는 퍼블릭 IP가 있다면, IP로 연결하면 되지만,

저는 Elb로 바로 연결할거기때문에 사전에 아래 내용은 Elb셋팅이 꼭 되어 있어야 합니다 ~

 

 

레코드 생성 버튼을 눌러줍니다 !

 

[레코드 이름] : 사용할 서브도메인 앞의 부분을 입력해주십니다

[별칭] : elb와 연결하기 위해 꼭 활성화 해주세요.

[트래픽 라우팅 대상] : 본인의 리전정보로 사용할 elb를 선택해주시면 됩니다.

 

위 내용이 전부 입력되었으면 레코드 생성을 눌러줍니다.

 

자, 이제 레코드가 생성이 된 것이 보일거에요 ~

하지만 이렇게 되었다고 바로 접근이 가능한건 아닙니다 ~

 

https://www.whatsmydns.net/#A/test.bigtori.store

 

DNS Propagation Checker - Global DNS Checker Tool

Instant DNS Propagation Check. Global DNS Propagation Checker - Check DNS records around the world.

www.whatsmydns.net

위 URL에서 본인의 레코드를 입력 후 검색 해봅니다 !

 

 

그럼 DNS서버에 본인의 도메인이 얼마나 뿌려졌나 확인 할 수 있습니다

체크상태가 어느정도 나와야 접근이 가능하니 바로 나오지 않는다고 너무 상심하지 마세요 :)


앗차차 그리고 꼭 체크해주셔야 하는 부분이있습니다 !

aws 보안그룹에서 인바운드규칙과 아웃바운드규칙을 확인하셔서 본인 서비스에 맞게 규칙이 설정되어있는지 체크해주세요 ~

본인 포트가 막혀있다면 접근이 안될 수 있습니다 !!

 

 

위 내용까지 마무리하면 본인의 도메인이 정상적으로 elb 혹은 IP와 연결되는것을 확인하실 수 있을거에요 !

감사합니다 ~

반응형
반응형
리엑트의 이벤트 시스템

사용자가 웹 브라우저에서 DOM요소들과 상호 작용하는 것을 이벤트(event)라고 한다.

리액트의 이벤트 시스템은 웹 브라우저의 HTML 이벤트와 인터페이스가 동일하기 때문에 사용법이 꽤 비슷하다.
하지만 주의해야 할 몇 가지 사항이 있다.

 

이벤트 사용 시 주의사항

1. 이벤트 이름은 카멜표기법으로 작성

     HTML에서는 onclick으로 작성하지만 리액트에서는 카멜 표기법으로 onClick으로 작성해야한다
2. 이벤트에는 함수 형태의 값을 전달

    HTML에서 이벤트를 설정할 때 ""안에 실행할 코드를 넣었지만, 리액트에서는 함수 형태의 객체를 전달한다. 애로우(화     살표)함수 문법을 사용하거나 혹은 외부에 미리 함수를 만들어서 전달하기도한다.

3. DOM요소에만 이벤트를 설정할 수 있다.

    div, button, input, form, span 등의 DOM요소에는 이벤트를 설정할 수 있지만, 직접만든 리액트 컴포넌트에는 이벤트를     자체적으로 설정할 수 없다.

<MyComponent onClick={doSomethine}>

    이 코드는 이름이 onClick인 props를 컴포넌트에 전달할 뿐이다.

    컴포넌트에 자체적으로 이벤트를 설정할 수는 없지만, 전달받은 props를 컴포넌트 내부의 DOM이벤트로

    설정할 수는있다.

<div onClick={this.props.onClick}>{/* ... */}</div>

리액트에서 지원하는 다양한 이벤트 종류는 아래의 링크를 통해 확인할 수 있다.

 

합성이벤트

 

합성 이벤트(SyntheticEvent) – React

A JavaScript library for building user interfaces

ko.reactjs.org

 

 

이벤트 핸들리 예제

컴포넌트 생성 및 불러오기

src 디렉토리에 EventPractice.js 파일을 만들고 App 컴포넌트에서 불러와 렌더링한다.

 

EventPractice.js

import React, { Component } from 'react';

class eventPractice extends Component {
    render() {
        return (
            <div>
                <h1>Event Practice</h1>          
            </div>
        );
    }
}

export default eventPractice;           <h1>Event Practice</h1>

 

App.js

import React from 'react';
import EventPractice from './eventPractice';

const App = () => {
  return <EventPractice/>
}

export default App;

onChange 이벤트 핸들링하기

EventPractice 컴포넌트에 input 요소를 렌더링하는 코드와 해당 요소에 onChange 이벤트를 설정하는 코드를 작성한다.

 

import React, { Component } from 'react';

class eventPractice extends Component {
    render() {
        return (
            <div>
                <h1>Event Practice</h1>        
                <input
                 tpye="text"
                 name="message"
                 placeholder="type something"
                 onChange={e =>{
                    console.log(e);
                 }}
                 />  
            </div>
        );
    }
}

export default eventPractice;

React 실행 후 콘솔창을 킨 후 input요소에 텍스트를 입력해본다.

콘솔에 SyntheticzEvent 라는 객체가 나타나는 것을 볼 수 있는데, 이 객체는 웹 브라우저의 네이티브 이벤트를 감싸는 객체로, 이벤트 함수의 파라미터(예제 코드에서는 e)로 접근할 수 있다.

 

네이티브 이벤트와 인터페이스가 같으므로, 순수 JS에서 HTML이벤트를 다룰 때와 똑같이 사용하면되지만, 네이티브 이벤트와 달리 이벤트가 끝나면 이벤트가 초기화 되므로 정보를 참조할 수 없기 때문에ㅡ 비동기적으로 이벤트 객체를 참조해야 한다면 e.persist()함수를 호출해 주어야 한다

 

이제 state에 input값을 담아보도록 한다. state 초기값을 설정하고 이벤트 핸들링 함수 내부에서 this.setState 메소드를 호출하여 state를 업데이트 한다

 

import React, { Component } from 'react';

class eventPractice extends Component {
    state = {
        message:'',
    }
    render() {
        return (
            <div>
                <h1>Event Practice</h1>        
                <input
                 tpye="text"
                 name="message"
                 placeholder="type something"
                 value={this.state.message}
                 onChange={e =>{
                    this.setState({
                        message: e.target.value,
                    })
                 }}
                 />
                 <button
                 onClick={ () => {
                    alert(this.state.message);
                    this.setState({
                        message:'',
                    });
                 }}  
                 >
                 submit
                 </button>
            </div>
        );
    }
}

export default eventPractice;

input에 아무거나 입력 후 버튼을 누르면 해당 값이 alert으로 호출되는것을 확인 할 수 있다.

 

임의 메소드 만들기

현재의 코드는 이벤트에 실행할 함수를 렌더링 메소드 내부에 만들어서 전달해주고 있다. 이 방법 대신 함수를 미리 만들어 전달하면 가독성을 높일 수 있다.

import React, { Component } from 'react';

class EventPractice extends Component {
  state = {
    message: '',
  };

  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
    this.handleClick = this.handleClick.bind(this);
  }

  handleChange(e) {
    this.setState({
      message: e.target.value,
    });
  }

  handleClick() {
    alert(this.state.message);
    this.setState({
      message: '',
    });
  }

  render() {
    return (
      <div>
        <h1>Event Practice</h1>
        <input
          type="text"
          name="message"
          placeholder="type something"
          value={this.state.message}
          onChange={this.handleChange}
        />
        <button onClick={this.handleClick}>Submit</button>
      </div>
    );
  }
}

export default EventPractice;

여기서 주의해야할 점은 this 바인딩이다. this는 함수가 어디서 호출되는지에 따라 결정된다.

클래스의 임의 메소드가 특정 HTML요소의 이벤트로 등록되는 과정에서 메도스와 this의 관계가 끊어지게된다.

 

따라서 this를 컴포넌트 자신으로 가르키게 하기 위해서는 메소드를 this와 바인딩하는 작업이 필요하고, 현재 코드에서는 constructor 함수 내부에서 함수를 바인딩하고 있다. 메소드 바인딩은 이렇게 생성자 메소드에서 하는 것이 정석이다. 새 메소드를 만들때마다 constuctor도 수정해야하기 때문이다.

하지만 클래스형 컴포넌트에서 public class fields 문법을 사용하여 화살표 함수로 메소드를 구현하면, 좀 더 편하게 작성할 수 있다. 화살표 함수의 this는 부모함수의 this를 상속받는데 JS에서 클래스는 함수로 구현되어 있기 때문에 this는 컴포넌트 자신이 되므로 bind(this)를 하지 않아도 된다.

import React, { Component } from 'react';

class EventPractice extends Component {
  state = {
    message: '',
  };

  handleChange = e => {
    this.setState({
      message: e.target.value,
    });
  };

  handleClick = () => {
    alert(this.state.message);
    this.setState({
      message: '',
    });
  };

  render() {
    return (
      <div>
        <h1>Event Practice</h1>
        <input
          type="text"
          name="message"
          placeholder="type something"
          value={this.state.message}
          onChange={this.handleChange}
        />
        <button onClick={this.handleClick}>Submit</button>
      </div>
    );
  }
}

export default EventPractice;

이 문법은 실험적인 문법으로 바벨을 설정해주어야 하는데 Create-React-App으로 만든 프로젝트는 이 문법이 기본적으로 설정되어 있으므로 사용 가능하다.

 

input 여러개 다루기

이제 input 값을 state에 넣는 방법을 알아보았다. input이 여러개일때 방법을 알아보자. 메소드를 여러개 만들어 해결할 수 있지만, event 객체를 활용하면 더 쉽게 처리할 수 있다

onChange 이벤트 핸들러에서 e.target.name은 해당 input의 name을 가리킨다. 이값을 이용해 state를 설정하면 더 쉽게 해결할 수 있다.

import React, { Component } from 'react';

class EventPractice extends Component {
  state = {
    username: '',
    message: '',
  };

  handleChange = e => {
    this.setState({
      [e.target.name]: e.target.value,
    });
  };

  handleClick = () => {
    alert(this.state.username + ': ' + this.state.message);
    this.setState({
      username: '',
      message: '',
    });
  };

  render() {
    return (
      <div>
        <h1>Event Practice</h1>
        <input
          type="text"
          name="username"
          placeholder="User name"
          value={this.state.username}
          onChange={this.handleChange}
        />
        <input
          type="text"
          name="message"
          placeholder="type something"
          value={this.state.message}
          onChange={this.handleChange}
        />
        <button onClick={this.handleClick}>Submit</button>
      </div>
    );
  }
}

export default EventPractice;
handleChange = e => {
  this.setState({
    [e.target.name]: e.target.value,
  });
};

이 코드를 보면 e.target.name을 []로 감싸는데 이렇게 객체안에서 key를 []로 감싸면 그 안에 넣은 레퍼런스가 가리키는 실제 값이 key값으로 사용된다.

 

onKeyPress 이벤트 핸들링

키를 눌렀을 때 발생하는 KeyPress 이벤트를 처리해본다. 두 번째 인풋에서 Enter키를 눌렀을때 handleCllck 메소드를 호출하도록 코드를 추가한다.

import React, { Component } from 'react';

class EventPractice extends Component {
  state = {
    username: '',
    message: '',
  };

  handleChange = e => {
    this.setState({
      [e.target.name]: e.target.value,
    });
  };

  handleClick = () => {
    alert(this.state.username + ': ' + this.state.message);
    this.setState({
      username: '',
      message: '',
    });
  };

  handleKeyPress = e => {
    if (e.key === 'Enter') {
      this.handleClick();
    }
  };

  render() {
    return (
      <div>
        <h1>Event Practice</h1>
        <input
          type="text"
          name="username"
          placeholder="User name"
          value={this.state.username}
          onChange={this.handleChange}
        />
        <input
          type="text"
          name="message"
          placeholder="type something"
          value={this.state.message}
          onChange={this.handleChange}
          onKeyPress={this.handleKeyPress}
        />
        <button onClick={this.handleClick}>Submit</button>
      </div>
    );
  }
}

export default EventPractice;

함수형 컴포넌트로 구현해 보기

이제 클래스형 컴포넌트로 작성했던 EventPractice 컴포넌트를 함수형 컴포넌트로 바꾸어본다.

import React, { useState } from 'react';

const EventPractice = () => {
  const [username, setUsername] = useState('');
  const [message, setMessage] = useState('');
  const onChangeUsername = e => setUsername(e.target.value);
  const onChangeMessage = e => setMessage(e.target.value);
  const onClick = () => {
    alert(username + ': ' + message);
    setUsername('');
    setMessage('');
  };
  const onKeyPress = e => {
    if (e.key === 'Enter') {
      onClick();
    }
  };

  return (
    <div>
      <h1>Event Practice</h1>
      <input
        type="text"
        name="username"
        placeholder="User name"
        value={username}
        onChange={onChangeUsername}
      />
      <input
        type="text"
        name="message"
        placeholder="type something"
        value={message}
        onChange={onChangeMessage}
        onKeyPress={onKeyPress}
      />
      <button onClick={onClick}>Submit</button>
    </div>
  );
};

export default EventPractice;

기능이 이전과 같이 동작하는지 확인해본다.

 

위의 함수형 컴포넌트 코드에서는 e.target.name을 사용하지 않고 onChange 관련 함수를 따로 만들었다. 하지만 input의 개수가 많아질수록 불편해지므로 e.target.name을 활용하는 것이 더 좋을 수 있다.

 

import React, { useState } from 'react';

const EventPractice = () => {
  const [form, setForm] = useState({
    username: '',
    message: '',
  });
  const { username, message } = form;
  const onChange = e => {
    const nextForm = {
      ...form,
      [e.target.name]: e.target.value,
    };
    setForm(nextForm);
  };
  const onClick = () => {
    alert(username + ': ' + message);
    setForm({
      username: '',
      message: '',
    });
  };
  const onKeyPress = e => {
    if (e.key === 'Enter') {
      onClick();
    }
  };

  return (
    <div>
      <h1>Event Practice</h1>
      <input
        type="text"
        name="username"
        placeholder="User name"
        value={username}
        onChange={onChange}
      />
      <input
        type="text"
        name="message"
        placeholder="type something"
        value={message}
        onChange={onChange}
        onKeyPress={onKeyPress}
      />
      <button onClick={onClick}>Submit</button>
    </div>
  );
};

export default EventPractice;

정리

리액트에서 이벤트를 다루는 것은 순수 JS또는 jQuery를 사용한 웹 애플리케이션에서 이벤트를 다루는 것과 비슷하다. 따라서 기존 HTML DOM Event를 알고 있다면 리액트의 컴포넌트 이벤트도 쉽게 다룰 수 있다.


 

 

참조

김민준님의 리액트를 다루는 기술 참조

반응형

'FrontEnd > React' 카테고리의 다른 글

리엑트 공부 재시작 !  (2) 2023.01.22
[React] Modal창 열기  (0) 2023.01.22
React - Node 연동  (0) 2023.01.22
[React] UseEffect  (0) 2023.01.01
ref: DOM에 이름달기  (0) 2022.10.14
반응형
contract Father{
	constructor(string memory _givenName){
    	givenName = _givenName;
    }
	string public familyName = "Lee";
    string public givenName = "Dae";
    uint256 public money = 100;
    
    function getFamilyName() view public returns(string memory){
    	return familyName;
    }
    
    function getGivenName() view public returns(string memory){
    	return givenName;
    }
    
    function getMoney() view public returns(uint256){
    	return money;
    }
}


contract Son is Father("Yong"){ //생성자를 이용하여 아들이름 변경
	
}
반응형

'솔리디티' 카테고리의 다른 글

오버라이딩  (0) 2022.06.25
functuion String  (0) 2022.06.25
view와 pure  (0) 2022.06.25
솔리디티 접근제한자  (0) 2022.06.25
Solidity Function정의  (0) 2022.06.25
반응형
view

function 밖의 변수들을 읽을 수 있으나, 변경 불가능

uint256 public a = 1;

function read() public view returns (uint256){
	return a + 2; //a변경 불가능하여 바로 리턴
}
pure

function 밖의 변수들을 읽지 못하고, 변경도 불가능

function read() public pure returns(uint256){
	uint256 a = 2; //밖의 변수 참조 불가능
    return b + 2;
}
둘다 명시 안할시

function 밖의 변수들을 읽어서, 변경해야함

IDE에서 값이 나오지 않음

uint256 a = 1;
function read() public pure returns(uint256){
	a = 13;
    return a;
}
반응형

'솔리디티' 카테고리의 다른 글

상속  (0) 2022.06.25
functuion String  (0) 2022.06.25
솔리디티 접근제한자  (0) 2022.06.25
Solidity Function정의  (0) 2022.06.25
Solidity 변수 타입  (0) 2022.06.25
반응형
public

모든 곳에서 접근가능

 

contract public_example{
	uint256 public a = 3;
    
    function changeA(uint256 _value) publuc {
    	a = _value;
    }
    function get_a() view public returns (uint256){
    	return a;
    }
}

contract public_example2{
	public_example instance = new public_example();
    
    function changeA_2(uint256 _value) public{
    	instance.changeA(_value);
    }
    function use_public_example_a() view public returns (unit256) {
    	return instance.get_a();
    }
}

 

external

public처럼 모든곳에서 접근 가능하다, external이 정의된 자기자신 컨트랙 내에서 접근 불가 (즉 다른 컨트랙에서 접근 할때)

 

private

오직 private이 정의된 자기 컨트랙트에서만 가능 (private이 정의된 컨트랙을 상속받은 자식도 불가능)

 

internal

private 처럼 오직 internal이 정의된 자기 컨트랙에서만 가능하고, internal이 정의된 컨트랙을 상속받은 자식도 사용 가능)

 

 

 

반응형

'솔리디티' 카테고리의 다른 글

상속  (0) 2022.06.25
functuion String  (0) 2022.06.25
view와 pure  (0) 2022.06.25
Solidity Function정의  (0) 2022.06.25
Solidity 변수 타입  (0) 2022.06.25
반응형

1. 파라미터와 리턴값이 없는 function

uint256 public it = 0;

function sample() public{
      it = 10;
}

 

 

2. 파라미터는 있고 리턴값이 없는 function

uint256 public it = 0;

function sample(uint256 _value) public{
      it = _value;
}

 

3. 파라미터, 리턴 둘다 있는 function

uint256 public it = 0;

function sample(uint256 _value) public returns(uint256) {
      it = _value;
      return it;
}
반응형

'솔리디티' 카테고리의 다른 글

상속  (0) 2022.06.25
functuion String  (0) 2022.06.25
view와 pure  (0) 2022.06.25
솔리디티 접근제한자  (0) 2022.06.25
Solidity 변수 타입  (0) 2022.06.25

+ Recent posts