안녕하세요~ 이전 포스트에서는 Spring Boot를 사용하여 백엔드에서 이미지 업로드 기능을 구현하는 방법을 알아보았습니다. 오늘은 프론트엔드에서 이미지를 업로드하기 위한 HTML 폼을 구현하는 방법을 살펴보겠습니다. HTML 폼 작성 이미지 업로드를 위한 HTML 폼은 다음과 같은 구성 요소를 포함합니다: 이미지 제목 입력 필드 이미지 파일 선택 필드 제출 버튼 HTML 폼 태그에는 enctype="multipart/form-data" 속성을 반드시 포함해야 합니다. 이 속성은 폼 데이터가 파일이나 이미지와 같은 바이너리 데이터를 포함할 수 있도록 지정합니다. 코드 예시 이미지 제목 이미지 파일 업로드 중요 요소 설명 이미지 제목: 사용자가 이미지에 대한 제목을 입력할 수 있는 텍스트 필드입니다.na..
안녕하세요! 오늘은 Spring Boot와 JPA를 사용하여 사진 업로드 기능을 구현하는 방법에 대해 이야기해보려고 합니다. 파일 업로드는 웹 애플리케이션에서 자주 사용되는 기능 중 하나입니다. 이 포스트에서는 사용자로부터 받은 사진 파일을 서버에 저장하고, 해당 정보를 데이터베이스에 기록하는 과정을 설명하겠습니다. 기본 설정 먼저, application.properties 혹은 application.yml 파일에 파일을 저장할 경로를 지정합니다. 아래는 제가 실제로 지정한 경로입니다. C드라이브 아래 workspace/{프로젝트이름}/upload/ 로 설정하였습니다. file: path: C:/workspace/interior/upload/ Cover 엔티티 사진 정보를 데이터베이스에 저장하기 위해 C..
안녕하세요! 오늘은 JPA를 사용하여 데이터베이스 모델을 구축할 때 자주 마주치는 무한 참조 문제와 이를 해결하는 방법에 대해 이야기하려고 합니다. 특히, @JsonIgnoreProperties 어노테이션을 사용하여 양방향 관계에서 발생하는 무한 참조 문제를 해결하는 방법을 살펴보겠습니다. 문제 상황 데이터 모델에 양방향 관계가 있는 경우, 예를 들어 Album과 Image 엔티티가 서로를 참조하는 경우, JSON 으로 직렬화할 때 무한 참조 문제가 발생할 수 있습니다. Jackson 라이브러리는 객체를 JSON 으로 변환할 때 이러한 양방향 참조를 처리하지 못하고 무한 루프에 빠질 수 있습니다. 문제의 예 Album 엔티티와 Image 엔티티가 서로를 참조하는 구조는 다음과 같습니다. @Entity p..
안녕하세요! 오늘은 Spring Framework 와 JPA 를 사용하여 의존 관계에 있는 테이블에 있는 데이터를 안전하게 삭제하는 방법에 대해 알아보겠습니다. 복잡한 데이터 모델에서는 하나의 엔티티가 다른 엔티티와 관계를 맺고 있을 때가 많습니다. 이러한 경우, 한 엔티티를 삭제할 때 관련 엔티티도 함께 삭제해야 할 필요가 있습니다. 오늘의 예제는 interior프로젝트에서 구현한 Album 엔티티와 이와 연관된 Image 엔티티들을 함께 삭제하는 상황을 살펴보겠습니다. 엔티티 관계 설정 먼저, Album과 Image 엔티티를 살펴보겠습니다. Album은 여러 Image 엔티티와 일대다 관계를 맺고 있습니다. @Builder @AllArgsConstructor @NoArgsConstructor @Dat..
안녕하세요. 오늘은 Spring Framework를 사용하면서 자주 마주치는 MissingPathVariableException에 대해 알아보고, 이 문제를 해결하는 방법을 공유하고자 합니다. 오류 개요 MissingPathVariableException은 Spring MVC에서 컨트롤러의 메서드가 URI 경로 변수를 요구하는데, 실제 요청 URL에 해당 변수가 포함되지 않았을 때 발생합니다. 에러 메시지는 다음과 같습니다 .w.s.m.s.DefaultHandlerExceptionResolver: Resolved [org.springframework.web.bind.MissingPathVariableException: Required URI template variable 'id' for method p..
객체지향 프로그래밍이 뭐야? 객체지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 데이터와 그 데이터를 처리하는 함수를 객체로 취급하여 프로그래밍하는 방식입니다. 주요 개념은 뭐야? 클래스(Class)와 객체(Object): 클래스는 객체를 생성하기 위한 템플릿이며, 객체는 클래스에 정의된 속성과 동작을 가지는 인스턴스입니다. 더보기 클래스와 객체 예시코드 public class Car { private String color; public Car(String color) { this.color = color; } public String getColor() { return color; } } public class Main { pub..
안녕하세요 오늘은 Docker hub에 내 이미지를 업로드하는 방법을 알아보도록 하겠습니다. 그냥 아무 이미지를 업로드하는 것보다 ubuntu 를 다운로드하고 내부에 vim 을 install 한뒤 커밋하는 방식으로 진행해 보겠습니다 1. 이미지파일 다운로드 및 실행 다운로드할 이미지입니다. Dokcer 에서 정식적으로 관리하고 있는 ubuntu image 입니다. cmd를 열어 순차적으로 실행하겠습니다. > docker run -dit ubuntu -dit 옵션이란? 도커(Docker)에서 -dit 옵션은 주로 컨테이너를 실행할 때 사용됩니다. 앞으로 자주 등장할 옵션이니 간략히 설명하겠습니다. 이 옵션은 세 가지 다른 옵션의 조합입니다: -d, -i, -t. 윈도우에서 도커를 사용할 때 이 옵션들의 의..
회의실 배정 성공 문제 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다. 입력 첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 ..
도커 작동 원리 단일 컨트롤 호스트 상에서 여러 개의 고립된 리눅스 시스템들을 실행하기 위한 운영 시스템 레벨 가상화 방법이다. 하나의 컴퓨터에 설치된 리눅스 운영체제에서 완전히 분리된 별도의 리눅스 시스템을 운영할 수 있는 기술 CPU, 메모리, 네트워크를 분리하여 마치 별도의 시스템처럼 사용할 수 있는 기술 이미지 삭제 절차 먼저 도커를 실행하면 docker run -d -p 80:80 docker/getting-started 명령어를 통해 도커 허브에 있는 컨테이너를 하나 샘플로 실행할 수 있습니다. > docker run -d -p 80:80 docker/getting-started 방금 다운받은 컨테이너와 관련된 것들(컨테이너, 이미지)을 깔끔히 삭제하는 과정을 복습해 보겠습니다. 먼저 도커 이..