viw 게시된 글

React 17과 TypeScript 환경에서 클래스 컴포넌트를 사용하고, 입력 필드가 3개일 때:
1번 입력에서 Enter → 2번으로 포커스 이동
2번 입력에서 Enter → 3번으로 포커스 이동
3번 입력에서 Enter → 조회 함수 호출
하는 예제

import React, { Component, createRef } from 'react';

interface State {
condition1: string;
condition2: string;
condition3: string;
}

class SearchForm extends Component<{}, State> {
input1Ref = createRef();
input2Ref = createRef();
input3Ref = createRef();

state: State = {

condition1: '',
condition2: '',
condition3: '',

};

handleKeyDown = (e: React.KeyboardEvent, fieldIndex: number) => {

if (e.key === 'Enter') {
  e.preventDefault();

  switch (fieldIndex) {
    case 1:
      this.input2Ref.current?.focus();
      break;
    case 2:
      this.input3Ref.current?.focus();
      break;
    case 3:
      this.handleSearch();
      break;
    default:
      break;
  }
}

};

handleChange = (e: React.ChangeEvent) => {

const { name, value } = e.target;
this.setState({ [name]: value } as Pick<State, keyof State>);

};

handleSearch = () => {

const { condition1, condition2, condition3 } = this.state;
console.log('검색 조건:', condition1, condition2, condition3);
// 실제 검색 함수 로직 여기에 작성
alert(`조회 호출: ${condition1}, ${condition2}, ${condition3}`);

};

render() {

const { condition1, condition2, condition3 } = this.state;

return (
  <form>
    <input
      type="text"
      name="condition1"
      value={condition1}
      onChange={this.handleChange}
      onKeyDown={(e) => this.handleKeyDown(e, 1)}
      ref={this.input1Ref}
      placeholder="조건 1"
    />
    <br />
    <input
      type="text"
      name="condition2"
      value={condition2}
      onChange={this.handleChange}
      onKeyDown={(e) => this.handleKeyDown(e, 2)}
      ref={this.input2Ref}
      placeholder="조건 2"
    />
    <br />
    <input
      type="text"
      name="condition3"
      value={condition3}
      onChange={this.handleChange}
      onKeyDown={(e) => this.handleKeyDown(e, 3)}
      ref={this.input3Ref}
      placeholder="조건 3"
    />
    <br />
    <button type="button" onClick={this.handleSearch}>
      조회
    </button>
  </form>
);

}
}

export default SearchForm;

onKeyDown={(e) => handleKeyDown(e, 1)} 에서 오류가 발생하는 이유는 TypeScript가 e의 타입을 명확히 추론하지 못해 발생하는 타입 불일치입니다.

onKeyDown={(e: React.KeyboardEvent) => handleKeyDown(e, 1)}

import React, { Component } from 'react';
import { AgGridReact } from 'ag-grid-react';
import { ColDef } from 'ag-grid-community';
import 'ag-grid-community/styles/ag-grid.css';
import 'ag-grid-community/styles/ag-theme-alpine.css';

const processTypeMap: Record<string, string> = {
PROCESS: 'Process',
VERIFY: 'Answer',
NOTFIY: 'Notify', // 'NOTIFY' 오타 여부 확인 필요
};

interface RowData {
id: number;
processType: string;
}

interface State {
columnDefs: ColDef[];
rowData: RowData[];
}

export class ProcessGrid extends Component<{}, State> {
constructor(props: {}) {

super(props);
this.state = {
  columnDefs: [
    { headerName: 'ID', field: 'id' },
    {
      headerName: '처리 유형',
      field: 'processType',
      valueFormatter: (params) => processTypeMap[params.value] || params.value,
    },
  ],
  rowData: [
    { id: 1, processType: 'PROCESS' },
    { id: 2, processType: 'VERIFY' },
    { id: 3, processType: 'NOTFIY' },
  ],
};

}

render() {

return (
  <div className="ag-theme-alpine" style={{ height: 300, width: '100%' }}>
    <AgGridReact
      columnDefs={this.state.columnDefs}
      rowData={this.state.rowData}
    />
  </div>
);

}
}

react, typescript에서 ag-grid field 중에 처리 유형이 있는데 항목은 PROCESS, VERIFY, NOTFIY 코드 인데 명칭은 PROCESS : 'Process', VERIFY: 'Answer', NOTFIY

const processTypeMap: Record<string, string> = {
PROCESS: 'Process',
VERIFY: 'Answer',
NOTFIY: 'Notify', // 오타가 아니라면 그대로 사용
};

import { ColDef } from 'ag-grid-community';

const columnDefs: ColDef[] = [
{

headerName: '처리 유형',
field: 'processType', // 해당 데이터 필드명
valueFormatter: (params) => processTypeMap[params.value] || params.value,

},
// 다른 컬럼들...
];

import React from 'react';
import { AgGridReact } from 'ag-grid-react';
import { ColDef } from 'ag-grid-community';
import 'ag-grid-community/styles/ag-grid.css';
import 'ag-grid-community/styles/ag-theme-alpine.css';

const processTypeMap: Record<string, string> = {
PROCESS: 'Process',
VERIFY: 'Answer',
NOTFIY: 'Notify', // 확인 필요
};

const columnDefs: ColDef[] = [
{ headerName: 'ID', field: 'id' },
{

headerName: '처리 유형',
field: 'processType',
valueFormatter: (params) => processTypeMap[params.value] || params.value,

},
];

const rowData = [
{ id: 1, processType: 'PROCESS' },
{ id: 2, processType: 'VERIFY' },
{ id: 3, processType: 'NOTFIY' },
];

export const ProcessGrid: React.FC = () => {
return (

<div className="ag-theme-alpine" style={{ height: 300, width: '100%' }}>
  <AgGridReact rowData={rowData} columnDefs={columnDefs} />
</div>

);
};

public class ResultColumnChecker {

/**
 * 조회 결과에서 resultFlag와 resultMessage 컬럼이 SELECT 절에 포함되어 있는지 확인합니다.
 *
 * @param resultList iBatis 조회 결과 (List<LinkedHashMap<String, Object>>)
 * @return true: 두 컬럼 모두 존재, false: 둘 중 하나라도 없음
 */
public static boolean checkColumnsInSelect(List<LinkedHashMap<String, Object>> resultList) {
    if (resultList == null || resultList.isEmpty()) {
        return false;
    }

    // 첫 번째 row 기준으로 컬럼 존재 여부 판단
    LinkedHashMap<String, Object> firstRow = resultList.get(0);
    Set<String> columnNames = firstRow.keySet();

    return columnNames.contains("resultFlag") && columnNames.contains("resultMessage");
}

// 사용 예시
public static void main(String[] args) {
    List<LinkedHashMap<String, Object>> resultList = new ArrayList<>();

    LinkedHashMap<String, Object> row = new LinkedHashMap<>();
    row.put("id", 1);
    row.put("resultFlag", null);       // 값은 null이어도 컬럼이 존재하므로 OK
    row.put("resultMessage", "");      // 빈 문자열도 OK

    resultList.add(row);

    boolean hasColumns = checkColumnsInSelect(resultList);
    System.out.println("SELECT 절에 컬럼 존재 여부: " + hasColumns);  // true 출력
}

}

1주차
온보딩

모두의연구소와 아이펠 교육 철학의 이해

아이펠을 AI 학교라고 부르는 이유, 커뮤니티 기반 성장형 교육이란 무엇인지 이해하기

아이펠 교육 방식 이해하기

게임형 퀘스트 유형 설명 및 실습하기

과정에서 목표로 하는 성장 이미지 공유하기

개발자의 기초 소양 갖추기

GitHub 사용 방법을 이해하고 실습하기

터미널로 배우는 리눅스 운영체제 이해하기

개발자의 글쓰기 전략과 필요성 이해하기

2~3주차
딥러닝 기초
머신러닝과 딥러닝 일반

머신러닝의 전반적인 프로세스와 머신러닝의 특징 및 기본 개념 이해하기

데이터 정제, 시각화, 모델 설계에 필요한 다양한 라이브러리 학습하기

기본 통계 개념

머신러닝을 위한 기본적인 통계 개념 학습하기

인공신경망과 딥러닝

인공신경망의 구조와 딥러닝의 기본적인 원리 학습하기

머신러닝과 딥러닝의 학습 프로세스 이해

딥러닝 모델 학습에서 발생 가능한 문제점을 이해하고, 해결 방안 도출하기

평가 지표를 설정하고 분석하는 법 이해하기
3~4주차
딥러닝 심화
다양한 딥러닝 모델 End to End 학습

데이터 준비와 전처리의 방법론 이해하고 실습하기

CNN, RNN~ Transformer 까지 계열 별 기본 모델을 학습시키면서 원리 이해하기

Task 별 딥러닝 적용의 원인을 이해하고 구현하기

데이터에 적절한 방법론의 종류를 이해하고 적용하기

DLthon

주어진 task로 프로젝트 수행

주어진 데이터를 활용하여 팀 프로젝트 완성하기

Task에 맞는 EDA와 전처리 실습하기

적절한 모델 선정하기

평가를 위한 지표 설정과 결과 분석하기

성능향상을 위한 논리적인 방법론 선택하기

심사를 통해 프로젝트 결과물 피드백 받기

8~11주차
딥러닝 고도화
컴퓨터비전(CV) 전공

깊은 레이어 모델을 학습할 때 문제점과 ResNet모델의 이론적 배경 이해 및 구현하기

데이터 증강 원리 이해하고 활용하기

Detection과 Segmentation 이론적 배경과 기술 학습하기

CNN을 분석하기 위한 XAI Tool 구현과 적용하기

OCR 기본 원리 이해하고 구현하기

CV 최신 트렌드 모델 이해하기

자연어처리(NLP) 전공

자연어 데이터와 임베딩 이해하기

토크나이징 원리와 적용법 이해하기

자연어 데이터의 벡터화 및 수치화하기

Attention 이해하기

Transformer 이해하고 구현하기

Hugging Face 모델 사용법 이해하고 학습 루프 구현하기

NLP 최신 트렌드 모델 이해하기

12~13주차
딥러닝 응용
MLOps 프로세스 학습

MLOps의 이해와 트렌드

머신러닝 도입 배경과 MLOps의 개념을 학습하며 MLOps 생태계와 주요 도구들을 탐구.

구현 전략과 성숙도 단계, 그리고 시장 동향과 미래 발전 가능성까지 통합적인 이해.

도커 활용과 컨테이너 관리

Docker의 설치와 기본 개념을 익히고, 컨테이너 환경 구성 및 최적화 전략 실습.

도커 스웜과 컴포즈를 활용한 오케스트레이션 기법 학습, 부하 분산 및 Kubernetes 기초 탐색.

GCP와 Vertex AI로 확장하기

Google Cloud Platform의 서비스와 BigQuery를 활용한 데잍터 처리.

Vertex AI를 활용한 모델 학습, 서빙, 그리고 클라우드 기반 AI 파이프라인 구축.

Airflow로 워크플로 자동화

에어플로 환경 구성과 DAG 설정을 중심으로, 데이터 워크플로 관리 실습.

복합적인 데이터 아키텍쳐 설계와 에어플로를 활용한 대규모 작업 관리.

데이터 및 모델 파이프라인

CI/CD 파이프라인의 기초부터 자동화된 빌드와 배포를 학습.

Vertex AI 기반의 파이프라인 구축 및 온라인 예측 배포를 통한 실무 지향적 훈련.

실전 프로젝트: 통합 MLOps

데이터 전처리, 모델 훈련, 배포를 포함한 파이프라인 설계와 개선 실습.

Kubeflow pipeline 도입 및 성능 모니터링, 최적화와 템플릿 자동화를 통한 실제 적용 경험

Mini AIFFELthon
해결하고자 하는 task로 프로젝트 수행

목표 정의 및 자료 확보를 통한 연구 계획 수립하기

주체에 적합한 데이터 탐색과 가공 진행하기

최적의 알고리즘 결정하기

검증을 위한 메트릭 선정과 산출물 해석하기

효율 개선을 위한 체계적인 접근법 채택하기

평가를 통해 최종 결과물 리뷰 받기

14~16주차
논문과 친해지기
논문 읽기

논문을 빠르게 읽고 효과적으로 이해하는 노하우 배우기

전공 별 트렌드에 맞는 HOT한 모델 이해하기

CV, NLP를 아우르는 MultiModal 모델 이해하기

논문 쓰는 노하우 배우기

CV: 3D gaussian splatting - Instance segmentation - ViT - DETR (+Dino)

NLP:Transformer-RAG Survey paper - QLoRA (+LoRA) - Deepseek-r1 (+Deepseek-v3)

공통: CLIP - Masked AutoEncoder - Segment anything - LLaVA (LLaVA-o1)

  • (논문은 트랜드를 반영하여 달라질 수 있음)
    17~24주차
    AI 연구 프로젝트
    Project Planning과 PoC LAB

아이디어를 구현하기 위한 합리적인 프로젝트 계획하기

계획의 구현 가능성과 문제점을 파악하고, 주어진 환경 자원에 맞춰 고도화하기

Project Managing

팀장, 팀원으로 기한 내 계획된 프로젝트를 완수하기 위한 시간관리, 자원 배분 등 매니징 능력 등 소프트스킬 기르기

Project 실행 및 문제해결 역량 기르기

파이프라인 구성과 커스텀 함수 등 다양한 구현 능력 기르기

구현 중 발생하는 다양한 문제 해결 능력 기르기