프로그래밍
-
linuxserver/ffmpeg 에서 drawtext 사용 시 한글 문제프로그래밍 2024. 7. 14. 01:10
ffmpeg을 사용해서 동영상의 상단에 제목을 붙이기 위해 drawtext를 사용하는 중에, 한글인 경우에 제대로 렌더링이 되지 않았다. 아예 깨지면 인코딩 문제라고 생각하겠는데, "안녕하세요" 라고 치면 안녕XX 이런식으로 나오는 문제가 있었다.linuxserver/ffmpeg:latest 이미지의 경우 ubuntu 기반으로 동작하는 것을 보고, 혹시 로케일 설정이 아닌가 생각해서 로케일을 ko_KR로 전부 바꾸고 빌드했지만 전혀 먹히지 않았다. 그러다가 utf-8에 대해서 보게 되었는데, utf-8에서 한글의 경우 한 글자 당 1바이트가 넘게 설정된다는 걸 보게 되었다. 여기서 힌트를 얻어 한글 한 글자당 2개의 공백을 주면 어떨까라는 생각이 들어 실행했고, 제대로 동작했다. 또한 공백을 주는 위치를..
-
Java heap memory 늘리기프로그래밍 2024. 6. 26. 16:31
ffmpeg을 이용한 영상 처리 서버를 만들고 프리 티어 EC2에 올려 테스트하는데, OutOfMemoryError가 발생했다.영상을 처리하려면 결국 원본 영상이 있어야하므로 당연히 메모리가 초과될 수 있을 것이라고 생각했다. https://repost.aws/knowledge-center/ec2-memory-swap-file그래서 위 포스트에서 나온 방법인 swapfile을 만들어 디스크를 메모리로 이용하여 성능과 용량을 트레이드 오프하는 방식으로 가용 메모리를 추가할 수 있었다. 기대를 품고 다시 컨테이너를 실행하는데, 또 OutOfMemoryError가 발생했다. 그러다 오류 메시지를 자세히 봤는데, java.lang.OutOfMemoryError: java heap space 라는 내용이 있었다...
-
Dockerfile 작성 시 주의할 점프로그래밍 2024. 6. 26. 16:17
이전 Dockerfile FROM openjdk:17-jdk-alpine as builderCOPY gradlew .COPY gradle gradleCOPY build.gradle .COPY settings.gradle .COPY src srcRUN chmod +x ./gradlewRUN ./gradlew bootJarFROM builder as ffmpegRUN apk updateRUN apk add --no-cache ffmpegFROM ffmpeg as executeCOPY build/libs/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "/app.jar"] 여기서 문제점은 COPY build/libs/*.jar app.jar 였다.as 문법을 통해서..
-
MySQL - 쿼리 작성 순서와 실제 실행 순서프로그래밍 2023. 7. 29. 15:43
복잡한 쿼리 문제를 풀 때에는 요구사항을 나눠서 하나씩 해결하는게 효과적이라는 걸 느꼈다. 그 중에서 가장 도움이 되었던 건 쿼리의 실제 실행 순서를 알면 쿼리를 짜는게 쉬워진다는 것이었다. MySQL 기준으로 쿼리를 작성할 때에는 1. SELECT 2. FROM 3. WHERE 4. GROUP BY 5. HAVING 6. ORDER BY 의 순서로 작성하게 된다. 하지만 실제 쿼리의 실행 순서는 1. FROM 2. WHERE 3. GROUP BY 4. HAVING 5. SELECT 6. ORDER BY 순으로 실행이 된다. 이 사실을 알면 group by에서 sum, avg와 같은 함수가 어떻게 select 문에 컬럼으로 존재할 수 있는지가 해결된다. 쓴걸로 보면 select가 group by 보다 먼..
-
[Spring Boot] @ModelAttribute 와 @RequestBody 의 차이프로그래밍 2023. 5. 21. 19:47
그동안 스프링 부트로 서버를 개발하면서 @ModelAttribute 와 @RequestBody의 정확한 차이를 모르고 그냥 MVC에서는 @ModelAttribute, REST API 개발에서는 @RequestBody 를 사용했다. 하지만 이번 팀 프로젝트에서 프론트와 백엔드를 붙이면서 여기서 문제가 발생했다. @ModelAttribute 는 URL에서 파라미터로 데이터를 전송할 때 해당 파라미터를 DTO 객체와 매핑시켜준다. 또한 이렇게 동작하기 위해서는 프론트에서 Content-Type 을 반드시 application/x-www-form-urlencoded 이나 multipart/form-data 로 설정해주어야 한다. @RequestBody 는 프론트에서 보낸 request 에서 body 를 파싱해서..
-
[Spring Boot] CORS 문제프로그래밍 2023. 5. 21. 19:41
팀 프로젝트 개발을 하던 도중에 CORS 문제가 발생하였다. 이번 팀 프로젝트에서 프론트 서버와 백엔드 서버를 나눠서 개발하기로 했는데, 두 개를 한 컴퓨터에서 포트를 바꿔 동시에 실행하고 데이터 송수신을 테스트하던 도중에 문제가 발생했다. 이유는 localhost더라도 포트가 다르기 때문에 origin이 달라 오류가 발생한 것이다. 이를 해결하기 위해서는 백엔드 서버에서 수신할 origin을 설정해주면 간단하게 해결된다. @RequiredArgsConstructor @RestController public class LoginApiController { private final LoginService loginService; @CrossOrigin(origins = "http://localhost:80..
-
자바 서블릿 (Java Servlet) 정리프로그래밍 2022. 10. 31. 23:24
Java Servlet Specification 정리 - 서블릿 동작 원리를 알기 위해 정리하는 것으로, 세부적인 내용은 모두 생략했다. 1. Overview 1.1 What is a Servlet? 서블릿(Servlet)은 동적 컨텐츠를 생성하는 컨테이너에 의해 관리되는 자바 기반 웹 컴포넌트이다. 다른 자바 기반 컴포넌트처럼, 서블릿은 플랫폼과 독립적이다. 따라서 자바 기반 웹 서버라면 어느 플랫폼이던 실행 가능하다. 서블릿 엔진이라고도 불리는 컨테이너(Container)는 서블릿 기능을 제공하는 웹 서버 확장(Extension)이다. 서블릿은 서블릿 컨테이너에 의해 구현된 request/response 패러다임을 통해 웹 클라이언트와 상호작용한다. 1.2 What is a Servlet Contai..
-
Spring Web MVC 레퍼런스프로그래밍 2022. 10. 29. 19:40
1. Spring Web MVC Spring Web MVC는 Servlet API를 기반으로 구축되었다. 1.1 DispatcherServlet Spring MVC는 DispatcherServlet이라는 중앙 서블릿이 request를 처리하지만, 실제 작업은 대리자에 의해 수행된다. DispatcherServlet은 다른 서블릿들과 마찬가지로 java configuration이나 web.xml을 통해 선언되고 매핑되어야 한다. 그 다음, DispatcherServlet은 Spring configuration을 이용하여 request 매핑이나 view resolution, 예외 처리를 위한 대리자를 찾는다. 아래 코드는 자바 설정을 등록하고 DispatcherServlet을 초기화하는데, 이는 서블릿 컨테..