React Component 란?

React 컴포넌트는 페이지에 렌더링할 React 엘리먼트를 반환하는 작고 재사용 가능한 코드 조각입니다. 가장 간단한 React 컴포넌트는 React 엘리먼트를 반환하는 일반 JavaScript 함수

( 함수 뿐만 아니라 class 로도 컴포넌트를 작성할 수 있다 )

 

Component 규약

1. 컴포넌트 함수의 첫 글자는 대문자로 시작한다.

컴포넌트 변수명은 대문자로 시작

 

2. 컴포넌트의 리턴 값은 최상단의 하나의 태그만을 갖는다

병렬의 태그를 리턴할 수 없다

 

 

컴포넌트를 사용하면 HTML 요소들을 더욱 편리하게 관리할 수 있으며 useState 와 useEffet 를 사용하여 동적인 화면을 구성할 수 있다.

728x90

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

[React] Redux  (0) 2025.02.01
[React] useState  (0) 2024.07.19

 

 

프로젝트를 진행하면서 백엔드 서버에서 프론트 측으로 이미지 정보를 전송해줘야 하는 경우가 많이 발생하였다.

 

보통은 이미지 서버를 별도로 운영하여 원본의 데이터를 제공하지 않고 이미지 서버(Storage)에 저장된 이미지의 url 을 제공하여 이미지를 제공하지만 제한된 프로젝트 기한 내에 이미지 서버까지 구축하는 데는 시간적으로 촉박할거 같아 백엔드 서버에서 원본 데이터를 프론트로 전송해주기로 했다.

 

처음엔 프론트에서 이미지나 파일을 multipart/form-data 로 백엔드 서버로 전송하여 처리했기 때문에 동일하게 백엔드 서버도 multipart/form-data 를 사용하여 이미지를 프론트로 전송하면 된다고 생각했다.

 

그러나 multipart/form-data 로 이미지를 전송된 이미지를 프론트에서 처리할 수 있는 방법이 존재하는지 몰랐고, 여러가지 방법을 찾던 와중 Base64 형태로 이미지를 백엔드 측에서 인코딩하여 문자열로 프론트로 보내주게 되면 프론트에서는 문자열로 인코딩된 이미지 정보를 <img src="data:image/<이미지확장자>;base64,<data코드>"> 다음과 같은 형태로 인코딩된 이미지를 바로 출력할 수 있다는걸 알게 되었다.

 

결국, 서버에서 이미지를 전송할때 Base64 로 이미지를 인코딩하여 인코딩된 문자열을 전송해주기로 하였다.

DTO 의 이미지 파일 이름을 기준으로 파일을 불러와 인코딩하여 다시 DTO 에 저장 후 RestController 를 통해 응답

 

위와 같이 Base64 로 인코딩된 이미지를 바로 보낼 때 장점과 단점

 

- 장점 -

1. 서버에서 이미지를 저장할 때 이미지의 원본을 저장할 필요 없이 인코딩된 문자열을 저장하여 바로 문자열을 불러 응답해줄 수 있다

2. 렌더링될 때 HTML dom 을 통해 렌더링되기 때문에 이미지가 끊기지 않고 출력된다

 

- 단점 -

1. 프론트 코드의 길이가 매우 길어지므로 코드의 가독성이 떨어진다

2. 용량이 증가한다

( 256가지를 표현할 수 있는 바이트를 printable한 64가지를 사용해서 표현하니 당연하다
다시 말해, 8비트를 6비트로 표현하는 것이다
3개의 8비트는 4개의 6비트로 표현할 수 있다
따라서 Base64 인코딩을 사용하면 원본보다 33%의 크기 증가가 발생한다 )

 

( 현재는 이미지 원본을 보내서 useState 에 데이터 키 값을 통해 받은 이미지 값을 return 하는 함수를 생성하고 해당 State 를 이미지 src 부분에 사용하면 이미지가 출력되는 것을 알게되었으므로 추후에 서버측과 클라이언트 측의 이미지 처리 방식 코드의 변경이 필요하다 )

 


 

- 참고 블로그 -

 

Base 64와 base64 img 사용하기

html에 img의 src에 url이 아닌 숫자와 문자로 구성된 긴 코드가 들어간 경우가 있었는데 data:image/png;base64와 같은 형태였다.검색 후 아래와 경우에는 이미지를 base64인코딩 방식으로 사용한다는것을

velog.io

 

728x90

 

 

useState 란?

리엑트의 useState 는 함수형 컴포넌트에서 상태를 관리하기 위한 Hook 중 하나

 

 

1. useState 를 import

import { useState } from 'react';
// useState 를 사용하기 위해선 react 에서 제공하는 useState 를 import!!

 

2. State 변수를 선언 및 사용

import { useState } from 'react';

function Example() {
	// like 는 사용 변수, setLike 는 State 변경 함수
	let [like, setLike] = useState(0);

	return (
            <div>
                <p onClick = { () => {
                        setLike(like + 1); // useState 변경 함수 사용하여 값을 변경
                }}>좋아요👍🏻 {like}</p> // useState 변수 사용
            </div>
    	);
}

 

useState 변수를 사용해 저장된 State 값을 꺼내서 사용하고, 변경 함수를 사용하여 State 에 저장된 값을 변경한다.

useState 는 component 를 띄우거나 띄우지 않거나 등 상태를 변경하는데 사용된다.

728x90

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

[React] Redux  (0) 2025.02.01
[React] React Component  (0) 2024.07.19
728x90

 

 

프로젝트를 진행하면서 매 주 혹은 매 일마다 유저 테이블의 특정 컬럼 값의 데이터를 초기화 시켜야하는 문제가 발생했다.

 

위 문제를 스케쥴러를 사용하여 처리하고자 하였는데 검색해보니 사용하려하는 MySQL 자체에서 제공하는 스케쥴러와 Java 에서 제공하는 스케쥴러 두 가지 방식이 존재하는 것을 알았다.

 

나는 위 두가지 방법 중 Java 에서 제공하는 스케쥴러 기능을 사용하기로 했는데 그 이유는 DB 에 스케쥴러를 적용할 경우 현재 개발 과정에서는 H2 데이터베이스를 사용하기 때문에 배포 이후 실제 사용하는 MySQL 데이터베이스에 스케쥴러를 설정하여 테스트를 진행해야 하는데 Java 에서 제공하는 스케쥴러를 사용하면 DB 가 변경되어도 메소드에서 호출하는 JPA 쿼리가 자동으로 변경된 데이터베이스로 쿼리를 변경하여 처리하기 때문이다.

 

1. @Scheduled 어노테이션을 사용하기 위해 메인 어플리케이션에 @EnableScheduling 설정

메인 어플리케이션에 @EnableScheduling 어노테이션을 적용해줘야 메소드에 사용하는 @Schedule 어노테이션이 정상적으로 작동한다

 

2. 반복적으로 실행하고자 하는 메소드에 @Scheduled 어노테이션 사용

사용하고자 하는 메소드에 @Scheduled 어노테이션을 사용하여 일정 시간 혹은 일정 간격마다 메소드를 반복 실행시킨다.

 

3. 메소드 반복 실행 주기를 설정 및 기준 시간 설정

반복 주기 설정 및 기준 시간 설정 ( 현재는 @Scheduled 속성 중 cron 표현식을 사용하였으며 매 월 1일 자정마다 메소드가 반복 실행되게끔 설정 )

반복 주기 표현은 @Scheduled 어노테이션의 속성 값 마다 표현 방법이 다르며 나는 cron 표현식을 사용하였다

 

- 반복 주기 및 기준 시간 설정 참고 블로그 -

 

[Spring Boot] @Scheduled을 이용해 일정 시간 마다 코드 실행하기

@Scheduled Spring Boot에서 @Scheduled 어노테이션을 사용하면 일정한 시간 간격으로, 혹은 특정 시간에 코드가 실행되도록 설정할 수 있다. 주기적으로 실행해야 하는 작업이 있을 때 적용해 쉽게 사용

dev-coco.tistory.com

 

 

위와 같이 @Schedule 어노테이션을 사용하여 반복적으로 쿼리 이벤트를 실행시키게끔 설정하여 문제를 해결하였다.

728x90

 

 

프로젝트를 진행하면서 Repository 를 Fork 하여 각자 개발 후 기능 구현이 완료되면 Pull Requests 를 통해 각자 구현한 기능을 Main Repository 에 등록하기로 하였다.

 

 

 

레포지토리를 Fork 한 이후 메인 레포지토리에 개발된 내용을 Pull Requests 시도하였는데, conflict 가 발생하였고 해당 문제를 해결하기 위해 내 로컬 레포지토리를 원격 메인 레포지토리와 동기화 시키는 과정이 필요했다

 

1. 원격지(upstream) 등록

우선은 등록되어 있는 원격지가 존재하는지 여부를 확인 ( $ git remote -v )

- 원격지(upstream)가 등록되어 있으나 url 이 등록되어 있지 않은 경우 ( $ git remote set-url upstream {원격지 주소} )

- 원격지(upstream)가 등록되어 있지 않은 경우 ( $ git remote add upstream {원격지 주소} )

 

2. 원격지(upstream) 의 최신 정보 동기화 및 merge

원격지의 branch 들과 commit 내용들을 내 로컬에 동기화 ( $ git fetch upstream )

fetch 후 branch 를 확인해보면 upstream/master 의 로컬 브랜치가 생긴다 ( $ git branch -va )

upstream 에서 가져온 브랜치를 로컬 브랜치와 병합 ( $ git checkout master -> $ git merge upstream/master )

 

3. 원격지의 최신 로그와 내 로컬 브랜치의 로그가 동기화 되었으니 merge 된 내용을 내 Fork 된 레포지토리에 push 한 뒤 Pull Requests 를 보낸다

728x90

 

 

 

 

 

web_crawling

web_crawling.pdf
3.59MB

 

비밀번호 : 댓글

728x90

 

 

 

 

 

Spring 과 연동하여 서비스 구현

 

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

 

파이썬 설치

 

workspace 폴더 생성

 

 

vscode 로 workspace 접속

 

 

google 에 사이킷런 모델 저장 검색

▲ 모델을 생성한 뒤 서버를 종료시켰다 다시 실행시키면 모델을 다시 학습시켜야 하기 때문에 모델을 파일로 저장해둔 뒤 사용 ▲

 

 

vscode 에서 파이썬 extension 설치

 

vscode 에서 code runner extension 도 설치

 

 

cmd 로 workspace 경로로 이동하여 django 설치

▲ 위 설정은 local 환경에 설치 ▲

 

 


 

가상환경으로 설치하여 관리하는 방법

 

 

가상환경 폴더를 하나 생성해서 가상환경에서 관리할 수도 있다

 

가상환경을 활성화

 

 

가상환경 종료

 

 

가상환경 내에서 pip install 을 사용해 가상환경 별로 각각 다른 버전의 라이브러리를 설치하여 관리할 수 있다

 


 

 

test1 이름으로 django 프로젝트 하나 생성

 

생성 완료

 

 

프로젝트 파일안에 들어가서 migrate 를 진행한다 (필수)

 

 

django 서버 실행

 

 

서버 주소 확인

 

 

접속 확인

 

 

test 경로로 들어오면 views 라는 파일의 test 함수를 실행하겠다

 

 

views.py 파일 생성 및 test 함수 선언하여 콘솔에 출력

 

 

HttpResponse 사용하여 웹으로 출력 후 확인

 

 

서버 종료 후 djangorestframework 라이브러리 설치

 

 

다시 서버 구동

 

 

프로젝트 경로 내의 templates 라는 폴더에서 view 단을 관리할 것이다라고 선언

 

 

BASE_DIR 은 여기에 선언되어 있음 ( default 는 프로젝트 폴더 까지 경로 )

 

 

서버 폴더 바로 하위에 templates 폴더 생성 후 안에 ajax.html 생성

 

ajax 경로로 접속할 시 views.py 파일의 ajax 함수를 실행

 

 

ajax 함수를 선언.... render 를 import 하여 html 파일을 응답해준다

 

 

html 간단하게 작성 코드는 아래

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
function get() {
  $.ajax({ url : "/result/", type : "GET",
    success : function(data) { $('#label').text(data.execute) } });
}
function post() {  $.ajax({ url : "/result/", type : "post",
    success : function(data) { $('#label').text(data.execute) } });
}
function put() {  $.ajax({ url : "/result/", type : "put",
    success : function(data) { $('#label').text(data.execute) } });
}
function del() {  $.ajax({ url : "/result/", type : "delete",
    success : function(data) { $('#label').text(data.execute) } });
}
</script>
<label id="label">button click</label><hr>
<button onclick="get()">GET</button> <button onclick="post()">POST</button>
<button onclick="put()">PUT</button> <button onclick="del()">DELETE</button>

 

 

result 경로로 접속 시 views.py 의 result 함수 실행

 

 

resframework 의 Response 와 api_view 를 import 하여 각각 get, post, put, delete 요청을 모두 result 함수로 처리하게 하고 요청 방식에 따라 로직을 구분하여 나눈다

 

 

코드 정삭적으로 실행되는 것 확인

 

 

경로 추가

 

 

test2 경로로 접속 시 실행될 함수 선언

 

 

spring 에서 jsp 파일에 코드를 작성

 

 

접속하면 에러가 뜨는데 이유는 서로 다른 서버에 데이터를 요청하게되면 에러가 발생함...!!!

 

이 에러를 해결해주기 위해선 라이브러리 설치가 필요하다

 

 

서로 다른 서버끼리 데이터 교환을 허용해주는 라이브러리인 django-cors-headers 설치

 

 

settings.py 에 접속하여 설치한 crosheaders 라이브러리를 설정해준다 >> 정상적으로 데이터가 전송된다

 

 

CORS(Cross-Origin Resource Sharing) : 서로 다른 서버들 끼리 데이터를 주고 받으려 할때 발생하는 오류

 

이제부터 데이터를 요청하고 응답하면 된다

 

대출이 가능한지 가능하지 않은지 확인하는 부분을 구현해볼 것임

 

pandas 설치

 

 

sklearn 설치 ( 사이킷런 )

 

bank 경로 추가

 

 

머신 코드 작성

 

 

test1 프로젝트 안에 있는 bank_analysis.py 파일을 import 하여 init() 으로 초기화하여 객체에 저장장

 

 

django 서버 재실행

 

 

이제 스프링 코드 작성

 

 

경로 작성

 

bank_form.jsp 작성 ( 코드 아래 참고 )

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
function test(){
    let form = {}
    //배열 형태로 만들어 준다[{name:day,value:값},{name:weather,value:값}...]
    let arr = $("#frm").serializeArray()
    for(i=0;i<arr.length;i++){
      form[arr[i].name]=arr[i].value
    }
    $.ajax({
      url : "http://localhost:8000/bank/", type:"GET",
      data: form , 
      contentType:"application/json;charset=utf-8",
      dataType:"json",
      success: function(data){
         console.log("전송 성공 : ", data);
         if( data.key == 0 )
            msg ="가입 가능성 있음"
         else
            msg ="가입 안합니다!!!!!"
         $("#result").html( msg )
      },error:function(){ 
         alert("문제 발생") 
      }
    })
}
</script>

</head>
<body>
   <h1>정기예금 가입 여부</h1>
   <b id="result">결과를 보여줍니다</b>
   <hr>
   <form id="frm">
      <input type="text" name="age" placeholder="사용자 나이 입력"><br>
      <input type="text" name="duration" placeholder="마지막 접촉 지속 시간(초)"><br>
      <input type="text" name="campaign"
         placeholder="마케팅 전화를 받은 수(몇번 통화 됐는지)"><br>
      <!-- 10일전 마지막 통화인지 20일전 마지막 통화인지를 수로 입력 -->
      <input type="text" name="pdays" placeholder="마지막으로 통화한 일 수"><br>
      <input type="text" name="previous" placeholder="가입 제의를 한 횟수"><br>
      <input type="button" onclick="test()" value="click">
   </form>
</body>
</html>

 

 

spring 서버 실행 후 경로 접속

 

 

접속 성공

 

 

spring 서버에서 데이터를 django 서버로 전송하여 데이터 처리 후 다시 spring 서버로 받아서 메세지 처리....

 

 

▼ 세부 코드 ▼

ml_test.zip
0.02MB
test_1.zip
0.02MB

 

ml_test : spring 파일

test_1 : vscode 파일 ( python )

728x90

+ Recent posts