240619 웹 개발 근무 기록입니다.

240619 웹 개발 근무 기록

 

240619 웹 개발 근무 기록

 

1. 진행 프로젝트

2. 오늘의 작업

3. 오늘 배운 것

4. 하루를 정리하며

관련글

1. 진행  프로젝트

SW 프로젝트

2. 오늘의 작업

  • 원자재 입고 페이지 CRUD 기능 완성
  • 제품 페이지 검사 항목 탭 추가, 품목 명 데이터 추가
  • 전체 화면 css 수정

3. 오늘 배운 것

  • 함수는 언제나 독립적으로 구성하기

4. 하루를 정리하며

 어제의 자괴감을 뒤로하고, 새로운 하루를 시작했다. 기존에는 각 페이지마다 함수를 정의하며 사용했기 때문에 함수 내부에서도 전역 변수를 그대로 불러오는 경우가 많았다. 그러다 보니 다른 곳에서 함수를 사용하려면 세부 내용을 수정해야 하는 불편함이 있었다.

 오늘은 기능 구현을 하면서 모든 변수들을 인자로 받아서 사용하는 함수를 만들어 모듈화하는 작업을 했다. 아직은 한 페이지에서만 사용해보았지만, 이 방식을 잘 활용한다면 한 파일의 코드량이 줄어들 것이고, 이후에 만들 화면에도 걸리는 시간이 단축될 것이라 기대하고 있다.

 다만, 이벤트 등이 많이 걸려있는 코드의 경우는 따로 분리하기가 어려워 보인다. 이러한 부분은 당장 정리하기 힘들 것 같아 주말 동안 고민해볼 계획이다.

 

관련글

이부분에는 플러그인 -> 이전글 발행 기능을 이용해서 이 글과 관련되거나 추천할 만한 글 몇개의 링크를 걸어주시는걸 추천 드립니다.

 네트워크는 개별적인 장치들이 서로 연결되어 데이터를 주고 받는 시스템입니다. 네트워크의 기본 개념에 대해 알아봅니다.

네트워크와 인터넷

네트워크와 인터넷

 

1. 네트워크

2. 인터넷

3. 로컬 네트워크 (LAN)

4. 광역 네트워크 (WAN)

5. 노드의 종류

1. 네트워크

  • 정의: 개별적인 장치들이 서로 연결되어 있는 것.
  • 구성 요소:
    • 노드 (Node): 데이터를 생성하고 송신하거나 수신하는 장치.
    • 메시지 (Message): 주고 받는 정보. 예를 들어 웹 페이지, 사진, 동영상 등이 있음.
    • 간선 (Edge): 데이터가 옮겨가는 경로. 유선 케이블이나 무선 신호로 구성됨.

2. 인터넷

  • 정의: 여러 네트워크가 합쳐진 것. 인터넷 역시 거대한 네트워크로 볼 수 있음.
  • 특징: 전 세계의 다양한 네트워크들이 상호 연결되어 정보를 주고 받을 수 있게 함.

3. 로컬 네트워크 (LAN)

  • 정의: 작은 범위 내에서 연결된 네트워크. 물리적으로 가까운 기기들 간의 네트워크.
  • 예시: 여러 도시나 국가에 걸쳐 있는 회사의 네트워크.

4. 광역 네트워크 (WAN)

  • 정의: 넓은 범위에 걸쳐 있는 네트워크. 도시, 국가에 걸친 네트워크.
  • 예시: 여러 도시나 국가에 걸쳐 있는 회사의 네트워크.

5. 노드의 종류

  • 단말 노드 (엔드 노드): 데이터를 생성하거나 최종적으로 수신하는 장치.
    • 예시: 컴퓨터, 스마트폰, 프린터, IoT 기기 등.
    • 비유: 택배의 출발지(발신자)와 최종 배송지(수신자).

  • 중간 노드: 데이터를 전달하고 경로를 결정하는 중간 장치.
    • 예시: 라우터, 스위치, 중계기 등.
    • 비유: 택배 허브나 분류 센터.

240618 웹 개발 근무 기록입니다.

240618 웹 개발 근무 기록

 

240618 웹 개발 근무 기록

 

1. 진행 프로젝트

2. 오늘의 작업

3. 하루를 정리하며

1. 진행 프로젝트

SW 프로젝트

2. 오늘의 작업

  • 탱크 페이지 입력 항목 추가
  • 원자재 입고 페이지 변경된 CRUD에 맞게 화면, 쿼리 수정

3. 하루를 정리하며

 오늘은 원자재 입고 페이지를 수정하다가 다른 페이지도 손을 볼 필요가 생겨서 우선 해당 페이지를 완성한 뒤 다시 원자재 입고 페이지로 돌아왔다. 출근할 때까지만 해도 금방 끝낼 수 있을 줄 알았는데, 작업이 예상보다 오래 걸렸다. 내가 생각한 문제점은 두 가지다.
 첫째, 자주 사용되는 UI 컴포넌트를 별도의 모듈로 분리하지 않고 각 페이지마다 복사 붙여넣기 후 내용을 수정하고 있기 때문이다. 페이지마다 소소하게 내용이 다르다 보니, 코드를 옮겨와 일일이 수정하는 작업이 상당히 비효율적이었다. 이런 방식을 개선하기 위해서는 공통 컴포넌트를 모듈화하고 필요할 때 불러오는 방식으로 전환해야 할 것 같다.
 둘째, 쿼리 하나하나를 테스트하는 데 시간이 너무 많이 걸린다. 화면을 만든 뒤 테스트를 할 때마다 쿼리를 조금씩 수정하는 경우가 많은데, 무턱대고 직접 테스트하다 보니 시간이 많이 소요되는 듯하다. 이를 해결하기 위해서는, 작업 중 발생한 쿼리 문제를 일차적으로 확인할 수 있는 체크리스트를 만들어두고, 먼저 해당 부분을 검사해서 무한의 테스트 굴레에서 벗어날 수 있도록 해야겠다.

 

 240617 웹 개발 근무 기록 입니다.

240617 웹 개발 근무 기록

 

240617 웹 개발 근무 기록

 

1. 진행 프로젝트

2. 오늘의 작업

3. 하루를 정리하며

1. 진행 프로젝트

SW 프로젝트

2. 오늘의 작업

  • 제품 주문 페이지 CRUD 기능 수정
  • 발주 형태의 기능이 있는 페이지 5개에 제품 주문 페이지와 동일한 형태로 기능 적용 (진행 중)

3. 하루를 정리하며

 오늘은 비슷한 형태의 기능을 가진 페이지들을 기존에 만들었던 함수를 통해 구현했다. 하지만 페이지마다 조금씩 달라지는 부분들이 있어 그때마다 함수를 조정해야 하는 아쉬움이 있었다. 이는 함수를 만들 때 유연성이 다소 부족했기 때문인 듯 하다.

물론 어디서나 쓸 수 있는 만능 함수를 만들기는 어렵겠지만, 필요한 값들을 하드 코딩하는 대신 인자로 받아서 구성할 수 있도록 노력해야 할 것 같다.

 

 웹 개발을 하다 보면 여러 이벤트가 순차적으로 발생하는 상황을 종종 있다. 이러한 이벤트의 실행 순서를 제대로 이해하면, 이벤트 간의 충돌을 방지하고 원하는 대로 기능을 구현할 수 있다.

마우스 클릭 시 이벤트 실행 순서 알아보기

 

마우스 클릭 시 이벤트 실행 순서 알아보기

 

0. 여는글

1. 이벤트 실행 순서 알아보기

2. 문제 해결

3. 문제를 해결한 코드

 

여는글

 최근, 검색어를 입력 받아 해당 입력 값에 해당하는 요소를 보여주는 UI 컴포넌트를 만들었다. 이 컴포넌트에서 의도한 동작 과정은 다음과 같다.

  1. Input 창에 포커스가 가면 해당 input 태그 아래에 자동 완성된 결과물을 보여준다. (focusin 이벤트)
  2. Input 창에서 포커스가 사라지면 결과물 창을 사라지게 한다. (blur 이벤트)
  3. 자동 완성된 결과물을 클릭하면 해당 요소의 값이 input의 값으로 들어가게 된다. (click 이벤트)

 그러나 결과물을 클릭해도 값이 input에 들어가지 않는 문제가 발생했다. 이는 결과물을 클릭하는 이벤트보다 포커스가 사라지는 이벤트가 더 빨리 실행되기 때문인 듯 했다.

 

See the Pen clickevent- by ka0824 (@ka0824) on CodePen.

1. 이벤트 실행 순서 알아보기

 이벤트의 순서를 알아보기 위해 다음과 같은 코드를 작성했다:


const test1DOM = document.getElementById("test1");
const test2DOM = document.getElementById("test2");

test1DOM.addEventListener("mousedown", (e) => {
  console.log("test1 mousedown");
});
test1DOM.addEventListener("focusin", (e) => {
  console.log("test1 focusin");
});
test1DOM.addEventListener("mouseup", (e) => {
  console.log("test1 mouseup");
});
test1DOM.addEventListener("click", (e) => {
  console.log("test1 click");
});
test1DOM.addEventListener("blur", (e) => {
  console.log("test1 blur");
});

test2DOM.addEventListener("mousedown", (e) => {
  console.log("test2 mousedown");
});
test2DOM.addEventListener("focusin", (e) => {
  console.log("test2 focusin");
});
test2DOM.addEventListener("mouseup", (e) => {
  console.log("test2 mouseup");
});
test2DOM.addEventListener("click", (e) => {
  console.log("test2 click");
});
test2DOM.addEventListener("blur", (e) => {
  console.log("test2 blur");
});

이 코드를 통해 알게 된 이벤트 실행 순서는 다음과 같았다.

  1. mousedown 이벤트
  2. (다른 요소의) blur 이벤트
  3. focusin 이벤트
  4. mouseup 이벤트
  5. click 이벤트

2. 문제 해결

 앞서 작성한 코드에서 자동 완성된 결과물을 선택하더라도 input에 값이 넣어지지 않았던 이유는 해당 요소의 클릭 이벤트 이전에 blur 이벤트가 발생했기 때문이다. blur 이벤트가 발생하면 자동 완성된 요소가 화면에서 사라지게 되어 실제로 클릭 이벤트가 일어나지 않았을 것이다.

 따라서, 클릭 이벤트 대신 mousedown 이벤트를 사용하면 원하는 대로 기능을 적용할 수 있다. 이는 mousedown 이벤트가 blur 이벤트보다 먼저 발생하기 때문이다.

3. 문제를 해결한 코드

click 이벤트를 mousedown 이벤트로 변경하여 문제를 해결하였다.

See the Pen event-order-example-2 by ka0824 (@ka0824) on CodePen.

'컴퓨터 과학 > 웹 개발' 카테고리의 다른 글

[웹] ARIA 속성 알아보기  (0) 2024.05.08
웹 페이지는 어떻게 그려지는가?  (0) 2024.04.25

for문과 forEach 메서드는 모두 반복문을 작성할 때 사용하지만, 작동 과정이 조금 다릅니다. 이 작동과정의 차이에서 발생하는 차이점에 대해 알아보겠습니다.

for문과 forEach메서드의 차이점 비교

 

for문과 forEach메서드의 차이점 비교

 

0. 여는글

1. `forEach`의 작동 과정

2. `for``문의 작동 과정

3. `forEach` 메서드와 `for`문은 언제 사용해야 될까?

4. 정리하기

 

여는글

 데이터를 저장하기 위해 서버로 보내기 전, 알맞은 값을 넣었는지 확인하는 작업이 필요했다. 그래서 forEach 메서드를 통해 값을 확인한 후, 적절하지 않은 경우에는 alert 창을 띄우고 저장 작업을 멈추도록 했다. 하지만 값에 문제가 있더라도 루프가 계속 진행되었고, 함수의 진행도 멈추지 않았다. 결국 forEach에서의 return문이 내가 생각한 방식과 차이가 있음을 알게 되었다.

const test = [
  { name: "김철수", age: 30 },
  { name: "김영희", age: undefined },
];

const handleSave = async (infos) => {
  // 값의 유효성 확인, 값이 없으면 alert 창 띄우기
  infos.forEach((info) => {
    if (!info.age) {
      console.log(`${info.name}의 나이를 입력해주세요!`);
      return;
    }
  });

  console.log("유효성 검사 통과!");
};

handleSave(test);
// 출력: "김영희의 나이를 입력해주세요!"와 "유효성 검사 통과!"가 모두 출력된다.

1. `forEach`의 작동 과정

 상기한 예시처럼 forEach의 콜백 함수에 return문을 넣더라도 루프가 계속 동작한다. 그 이유는 forEach가 각 요소마다 콜백 함수를 호출하는 방식으로 진행되기 때문이다.


const test2 = [2, 3, 4];
test2.forEach((num) => {
  if (num === 3) {
    console.log('3을 찾았다! 이제 루프 그만 두고 싶어!');
    return;
  }
  console.log('못 찾았다!');
});

 만약 이렇게 작성한 forEach 메서드가 있다고 가정해보겠다. 이러한 경우 아래의 코드와 같은 방식으로 실행된다.


callback(2);
callback(3);
callback(4);

 결국 콜백 함수 내부에 return문을 작성하더라도 그건 전체 반복문에 대한 return이 아닌, 콜백 함수 한 개의 return문이기 때문에 3을 찾은 이후에도 4를 대상으로 콜백 함수가 실행된다.

2. `for`문의 작동 과정

 상기한 `forEach` 메서드를 `for`문으로 바꿔보겠다.

const test2 = [2, 3, 4];

for (const num of test2) {
  if (num === 3) {
    console.log('3을 찾았다! 이제 루프 그만 두고 싶어!');
    return;
  }
  console.log('못 찾았다!');
}

 `for`문 안에서 작성된 `return`문은 전체 반복문을 종료하기에, 3을 찾은 이후에는 루프를 종료한다. 따라서 4를 대상으로는 루프를 진행하지 않는다. 결국 `forEach` 메서드와 `for`문의 차이는 콜백 함수 사용 여부에서 발생한다고 볼 수 있다.

3. `forEach` 메서드와 `for`문은 언제 사용해야 할까?

 `forEach` 메서드와 `for`문은 콜백 함수를 사용하느냐에서 차이가 있다. 그래서 장단점을 비교한다면 이 부분을 고려해서 살펴보면 된다.

 

  • `forEach` 메서드의 장점
    • `for`문에 비해 작성이 편리하다.
    • 코드가 간결하고 명확하여 가독성이 높다.
  • `forEach` 메서드의 단점
    • 배열의 요소가 많아질 시, 실행되는 콜백 함수의 갯수도 증가하므로 자원 소모(오버헤드)가 심해질 수 있다.
    • 각 요소마다 실행되는 콜백 함수의 내부 코드가 복잡해질 경우에도 자원 소모(오버헤드)가 심해질 수 있다.
    • `break`, `continue`를 사용할 수 없어 루프를 중간에 종료하거나 건너뛸 수 없다.

  • `for`문의 장점
    • `break`, `continue`를 통해 루프에 대한 제어가 가능하다.
    • 콜백 함수를 사용하지 않으므로, 배열이 길어지거나 루프 내에 실행하는 코드가 복잡하더라도 오버헤드가 심해지지 않는다.
    • 복잡한 반복 논리를 구현할 때 유리하다.
  • `for`문의 단점
    • 함수형 프로그래밍에서 형태가 다소 이질적이다.
    • 코드가 길어지거나 복잡해질 수 있어 가독성이 떨어질 수 있다.

4. 정리하기

forEach 메서드와 for문은 콜백 함수 사용 여부에서 차이가 있다. forEach 메서드는 작성하기는 간편하지만 성능 면에서는 for문에 밀릴 수 있다. 단순 루프일 경우에는 forEach를 사용해도 괜찮지만, 성능이나 반복문의 제어가 필요한 경우에는 for문을 사용하는 것이 좋다.

'javascript > 이론' 카테고리의 다른 글

자바스크립트의 이벤트 루프  (0) 2024.04.24

240614 웹 개발 근무 기록 입니다.

240614 웹 개발 근무 기록

 

240614 웹 개발 근무 기록

 

1. 진행 프로젝트

2. 오늘의 작업

3. 오늘의 배운 것

4. 하루를 정리하며

관련글

1. 진행 프로젝트

 SW 프로젝트

2. 오늘의 작업

  • 제품 주문 페이지 로직 적용
  • 자동완성 UI 컴포넌트 제작
  • 주문 품목 내역 테이블 수정

3. 오늘의 배운 것

  • blur, click 이벤트 실행 시점 문제 해결

4. 하루를 정리하며

 UI 컴포넌를 만들 때에 기능은 구상하였으나, 다른 레퍼런스를 참고해 보고 싶을 때가 있다. 그럴 땐 구글에 그냥 검색하는 것보다 codepen 같은 사이트에서 다른 사람들이 어떻게 만들었는지 확인해 보는 것이 좋다. 구체적은 코드 예시를 볼 수 있을 뿐 아니라 이전에는 고려하지 못했던 부분들을 찾아내는 경우도 있다.

관련글

2024.06.16 - [컴퓨터 과학/웹 개발] - 마우스 클릭 시 이벤트 실행 순서 알아보기

240613 웹개발 근무 기록입니다.

240613 웹 개발 근무 기록

 

240613 웹 개발 근무 기록

 

1. 진행 프로젝트

2. 오늘의 작업

3. 하루를 정리하며

1. 진행 프로젝트

 SW 프로젝트

2. 오늘의 작업

  • 생산 입고 페이지 레이아웃 만들기
  • 원자재 발주 -1 페이지 레이아웃 만들기
  • 기본 정보 탭 정부에 현재 선택된 항목 하이라이트 기능 추가
  • 포장 단위, 가격 입력 창 분리
  • 제품 주문 페이지 거래처 팝업창 타이틀 추가 및 위치 input 바로 밑으로 변경
  • 포장정보 테이블, 용량 컬럼에 단위 추가

3. 하루를 정리하며

 각 페이지에서 화면 전체를 초기화하는 기능이 필요했다. 초기화를 할 때에는 테이블의 데이터를 지우고, 특정 버튼을 안보이게 처리하고, input 태그의 값을 비워야 했다. 이러한 초기화 과정은 여러 이벤트에서 발생해야 했기에, 해당 이벤트들마다 테이블 초기화, 버튼 숨기기, input 값 비우기 함수를 넣어주었다. 하지만 이러한 초기화 함수들이 언제나 묶어서 실행된다면 차라리 하나의 함수로 다시 묶어서 실행하는 편이 깔끔하지 않을까 싶다. 짝을 이루어 발생하는 함수들은 공통된 함수로 묶어 실행하는 편이 좋을 듯 하다.

24.06.12 웹 개발 근무 기록 입니다.

240612 웹 개발 근무 기록

 

240612 웹 개발 근무 기록

 

1. 진행 프로젝트

2. 오늘의 작업

3. 오늘의 배운 것

4. 하루를 정리하며

관련글

1. 진행 프로젝트

 SW 프로젝트

2. 오늘의 작업

  • 페이지 레이아웃 1:1로 나누기
  • 기본 정보 탭 화면 진입 시 조회 이벤트 실행하기
  • 생산 입고 페이지 레이아웃 만들기
  • 원자재 발주-1 페이지 레이아웃 만들기
  • 각 페이지 테이블 높이 고정하여 전체 스크롤 방지
  • 기본 정보 탭 전부에 현재 선택된 항목 하이라이트 기능 추가
  • 포장 단위, 가격 입력 창 분리하기

3. 오늘의 배운 것

  • 테이블에 스크롤 추가 방법

4. 하루를 정리하며

 한 페이지에서 만든 기능을 다른 페이지에도 공통으로 적용하는 작업을 진행하였다. 다행히 해당 부분은 기능별로 함수를 나누어 작성했기에 공통 적용에 큰 어려움이 발생하지 않았다.

관련글

2024.06.12 - [css/문제해결] - table에 스크롤 적용하기

table의 길이가 길어지면 스크롤을 만들어 표현하고 싶을 때가 있습니다. 이때에 적용 방법에 대해 알아봅니다.

table에 스크롤 적용하기

 

table에 스크롤 적용하기

 

0. 여는글

1. 해결 과정

2. 최종 코드

 

여는글

 화면의 테이블이 있을 때, 테이블에 들어갈 내용이 많아지면 전체 화면에 스크롤이 생기는 경우가 있다. 전체 화면의 스크롤이 생기는 방식이 아니라 테이블에만 스크롤이 생기게 만들고 싶었는데, 단순히 table에 height만 설정하는 것만으로는 예상처럼 작동하지 않았다.


See the Pen table-scroll-example-1 by ka0824 (@ka0824) on CodePen.

1. 해결 과정

1. 테이블 레이아웃 문제: 


display: table; 때문에 속성 적용이 되지 않는다.

 

기본적으로 tbody의 display가 table로 지정되어 있어, 특정 CSS 속성(height, overflow 등)이 제한적으로 작동한다. 이를 해결하기 위해 tbody의 display를 block으로 변경하고. "overflow-y: auto;" 속성을 추가한다.

 


display를 block으로 변경한다.

2. Flexbox 사용: 


tbody가 너비를 모두 채우지 못하고 있다.

tbody가 가로로 꽉 안 차고 있으므로 상위 태그인 table에 display: flex; flex-direction: column;을 추가한다.


레이아웃 방식을 변경한다.

3. 행 너비 조정:


tr이 가로를 꽉 채우지 못하고 있다.

현재 tr이 가로에 꽉 안 차고 있으므로 tr에 width: 100%;을 추가한다.

 


너비를 지정한다.

 

4. 셀 너비 조정:


th, td가 너비를 모두 사용하도록 해야 한다.

 th와 td가 tr의 너비를 모두 사용하지 않고 있으므로 상위 태그인 tr에 display: flex속성을 주고 th td에 flex: 1속성을 추가한다.


flex를 사용해 너비를 모두 사용하게 한다.

2. 최종 코드

 모두 적용한 최종 코드


See the Pen Untitled by ka0824 (@ka0824) on CodePen.

+ Recent posts