TIL 54

JavaScript 배열 객체 수정 시 주의할 점 - 참조 vs 재할당

개요안녕하세요. 오늘은 JavaScript에서 배열 안의 객체를 수정할 때 주의해야 할 점에 대해 알아보려 합니다. 이번 주제는 지난번 포스팅에서 다뤘던 Shallow Copy(얕은 복사)와 Deep Copy(깊은 복사) 개념과도 밀접한 관련이 있습니다. 간단히 다시 짚자면, 얕은 복사는 객체의 1단계까지만 복사하고, 내부에 중첩된 객체는 여전히 원본 객체와 참조를 공유합니다. 반면에 깊은 복사는 객체 전체를 재귀적으로 복사하기 때문에 원본과 완전히 분리된 새로운 객체가 생성됩니다. 이와 비슷하게, 배열 안에 있는 객체도 참조와 재할당에 따라 전혀 다른 동작을 하게 됩니다. 어떤 차이가 있는지, 아래 예제를 통해 좀 더 자세히 살펴보겠습니다😁 참조📙참조는 객체(Object), 배열(Array), 함수..

TIL 2025.05.22

jQuery .off()를 사용한 이벤트 중복 방지 처리

개요웹 개발을 하다 보면 keydown, click, change 등 다양한 이벤트를 바인딩하게 됩니다. 하지만 문제는 이벤트가 중복 등록되어, 원하지 않게 이벤트가 두 번 호출된다거나, 함수가 여러 번 실행되는 문제가 생길 수 있습니다. 특히 모달창을 여러 번 열고 닫을 때, 혹은 동적으로 요소를 다시 그릴 때 이런 문제가 왕왕 발생합니다. 오늘은 이를 예방하는 가장 간단하고 효과적인 방법을 소개하려 합니다. 하단에서 좀 더 자세히 살펴볼게요😃 왜 .off().on()을 써야 하나?📙$('#myButton').on('click', function() { doSomething();}); 위 코드처럼 작성하면 #myButton에 기존에 등록된 이벤트가 그대로 남아 있어서 같은 이벤트가 여러 번 실..

TIL 2025.04.29

Java로 구현하는 스트리밍 파일 다운로드

개요안녕하세요, 빈코입니다. 오늘은 Java에서 대용량 파일을 다운로드할 때 메모리 부하를 줄이기 위해 사용하는 '스트리밍 다운로드' 방식에 대해 이야기해보려고 합니다. 스트리밍은 데이터를 한 번에 모두 불러오는 것이 아니라, 조각조각 나눠서 전송하는 방식인데요.특히 큰 파일을 다운로드하거나, 여러 사용자가 동시에 파일을 요청해 메모리 사용량이 급증할 수 있는 상황에서 자주 활용됩니다.그럼 이제 실제 코드를 보면서 좀 더 자세히 설명드릴게요😃 Front📙 다운로드 테스트 첫 번째로, download_test라는 버튼을 UI에 정의하였습니다. 사용자들은 해당 버튼을 통해 다운로드를 진행하게 됩니다. document.getElementById('download_test').addEventListene..

TIL 2025.04.23

Java 서버 자동 실행 + 데몬 설정 쉽게 끝내기

개요안녕하세요, 빈코입니다! 오늘은 Java로 작성한 프로그램을 서버 환경에서 자동으로 실행되도록 설정하는 방법, 즉, 데몬(Daemon)처럼 백그라운드에서 항상 실행되도록 만드는 과정에 대해 소개하려고 합니다. 자세한 내용은 하단에서 설명드릴게요 😊 데몬 실행📙데몬(Daemon)은 일반적으로 운영체제의 백그라운드에서 조용히 실행되는 프로그램을 뜻합니다. 즉, 화면에 띄워지지는 않고, 시스템이 켜질 때 자동으로 시작되어 지속적으로 특정 작업을 수행하는 프로세스라고 생각하면 됩니다. 쇼핑몰을 예를 들어서 만약, 사용자가 원하는 특정 시간마다 매출액에 관한 엑셀을 만들어서 보내야 하는 경우에 해당 엑셀을 만드는 프로그램을 구성 후 시스템 서비스 또는 데몬 프로세스로 등록해 두면 운영에 훨씬 유리하고 ..

TIL 2025.04.17

Java FTP 파일 전송하는 방법 + 쉬운 예제(Front~Back)

개요안녕하세요 빈코입니다. 오늘은 Java에서 FTPClient()를 활용하여 서버에 파일을 전송하는 방법에 대해 포스팅하려고 합니다. 포스팅은 Front에서부터 Back까지 전반적으로 진행하기 때문에, 만약 DB에서 파일을 꺼내오시는 분들은 Service 챕터만 확인하시면 됩니다😁그럼 시작해 볼까요? UI 📙 첫 번째로는 FTP 서버에 파일을 보내기 위해서는 FTP 서버 연결을 위한 4가지 정보(host, port, user, password)가 필요합니다. 그래서 UI에서 입력받도록 설정하였고, 저는 간단한 예시 작성을 위해 파일은 사용자에게 입력 받도록 구성했습니다. 코드는 아래와 같습니다. FTP 테스트 FTP 서버 : 사용자명 ..

TIL 2025.03.13

Java 파일 다운로드 OutOfMemoryError 해결방법(전체 예시)

개요안녕하세요 빈코입니다. 오늘은 저번 포스팅에 이어 Java에서 파일 다운로드 시 메모리 부족으로 인해 생기는 OutOfMemoryError에 대해 전반적인 코드를 소개하려 합니다. 저번 포스팅과 중복되는 부분도 있겠지만, 해당 포스팅만 보시는 분들을 위해 전체적으로 다 소개하려 합니다. 코드는 하단에서 설명할게요😁 설정📚저번 포스팅에서 언급했듯이 Java에서 StreamingResponseBody를 사용하려면 여러 가지 설정이 필요합니다. 첫 번째로 javax.servlet-api 버전이 3.0 이상이어야 합니다. Maven이나 Gradle에 아래와 같이 추가해주세요😁// Maven javax.servlet javax.servlet-api 4.0.1 provided // ..

TIL 2025.01.11

Java 파일 다운로드 OutOfMemoryError 해결방법(예시)

개요안녕하세요 빈코입니다. 오늘은 Java 기반 프로젝트에서 파일 다운로드 시 OutOfMemoryError 에러를 해결하는 방법에 대해 포스팅하려 합니다. OutOfMemoryError는 직역 그대로 메모리 사용 초과 오류입니다. 해당 오류는 여러 클라이언트가 파일을 동시에 다운로드할 때, 혹은 파일의 크기가 큰 파일을 여러 번 다운로드할 때 메모리가 초과되어 발생되는 오류입니다. 하단에서 예시와 함께 알아볼게요😊 파일 다운로드 - 메모리 방식📙파일 다운로드는 크게 2가지의 방법으로 로직 구현이 가능합니다. 첫 번째는 일반적으로 사용하는 파일을 메모리에 올려서 다운로드 하는 방법과 두번째로는 스트리밍 방식으로 다운로드 로직을 구현을 할 수 있습니다. 각각의 장단점이 존재하는데 우선 일반적으로 사용하..

TIL 2024.12.31

Java 이미지 파일 다운로드 기능 구현하기(예제 포함)

개요안녕하세요 빈코입니다. 오늘은 Java를 활용한 이미지 다운로드 기능에 대해 포스팅하려 합니다. 이미지 다운로드는 크게 2가지로 분류되는데, 이미지의 binary를 직접 DB에 등록하거나 또는 이미지의 파일명과 파일 경로만 DB에 저장한 후 해당 정보를 꺼내서 서버에 등록된 이미지를 찾는 방법이 있습니다. 실무에서는 DB 공간을 생각하여 binary를 직접 등록하지 않고, 서버에 저장하는 방식으로 많이 사용하기 때문에 이번 포스팅도 서버에서 찾아서 다운로드하는 방법을 포스팅하려 합니다. 자세한 방법은 하단에서 설명할게요😃 파일 Table & 조회 Query📙CREATE TABLE file_info ( id INT AUTO_INCREMENT PRIMARY KEY, file_name VAR..

TIL 2024.12.27

js 드래그 앤 드롭(drag&drop) 사용하기

개요안녕하세요 빈코입니다! 오늘은 js에서 순서를 변경하는 기능인 drag&drop 기능에 대해 포스팅하려고 합니다. 드래그 앤 드롭은 파일을 마우스로 옮기거나 특정 요소들을 원하는 순서로 배치하기 위해 많이 사용하는데, 오늘은 체크박스들의 위치들을 옮기는 작업들을 같이 해보려고 합니다. 자세한 내용들은 하단에서 설명할게요😃 드래그 앤 드롭 예시📙먼저 드래그 앤 드롭의 예시 먼저 살펴볼까요?  5개의 과일을 각각 체크박스로 명시한 후 위의 영상과 같이 순서를 변경하는 간단한 예시를 들어봤습니다. 실무에서는 사용자 인터페이스에서 정렬 기능을 제공해야 할 때 주로 해당 기능을 사용하는데, 예를 들어 대시보드나 위젯을 사용자가 원하는 레이아웃으로 변경하는 기능을 제공한다던가 혹은, 데이터 테이블의 칼럼을 ..

TIL 2024.12.18

Java Integer와 int 차이로 인한 오류 방지 (실무 예제)

개요안녕하세요 빈코입니다. 오늘은 제가 실무에서 작업을 하면서 겪었던 오류와 해결과정을 포스팅하려고 합니다. 특정 조건들을 통해 데이터의 개수를 구할 때, Integer 혹은 int로 정의를 하게 되는데 해당 과정에서 잘못 된 선언으로 인해 결함이 나오게 되었습니다. 하단에서 좀 더 자세히 살펴볼게요😄 겪은 오류📙제가 겪은 오류는 특정 조건으로 DB의 데이터 개수를 구할 때 int 형으로 선언하고 진행했었는데, 해당 조건의 데이터가 아예 없어서 NULL 오류를 겪게 되었습니다. CommonMapper.getLogCount attempted to return null from a method with a primitive return type(int) // 오류 내용 Mybatis와 같은 Mapper..

TIL 2024.12.14