Spring Boot (+ RESTful) 38

RESTful 웹 서비스 구축 - # Project 04 - 이미지 처리, GPU 사용과 관련한 질문

https://wy-family.tistory.com/93 프로젝트 진행 중, 이미지 업로드와 관련된 내용이 있었고, 해당 내용과 관련해서 궁금한 점들이 정말 많았고, 너무 많아서 블로그 글로 10개나 남기게 되었다. 질문에 대한 답을 어느 정도 정리했고 정리하면서 이해는 했는데, 한 가지 또 생긴 궁금증이 있다. BufferedImage 에 대한 부분에서, 이미지 처리는 한 번에 할 수 없다는 듯이 말하고 있다. 이미지 파일은 한 번에 읽어들이고 쓸 수 있는게 가능하지 않다고 해서 메모리 버퍼에 이미지를 올려야 한다고 했다.그런데 여기서 궁금증이 발생한다. 내가 고사양의 그래픽을 요구하는 게임을 한다고 하면, 게임의 화면 하나 하나, 장면 하나 하나가 모두 이미지 파일의 연속적인 상황이라고도 볼 수 있..

RESTful 웹 서비스 구축 - # Project 04 - 이미지 업로드 (10)

질문 20. BufferedImage thumbImg=null;BufferedImage img=ImageIO.read(originFile.getInputStream());thumbImg = Scalr.resize(img, Scalr.Method.AUTOMATIC, Scalr.Mode.AUTOMATIC, width, Scalr.OP_ANTIALIAS); 라고 했어. 일단 원본 파일에 있는 이미지를 메모리로 읽어들인다. 원본 파일에서 이미지로 변환을 시키는 것이다. 원본 이미지를 이미지 변환을 시킬 수 있도록 BufferedImage 에다가 집어넣는 것이다. 원본 이미지를 담은 다음에, 아까 의존성 추가한 lib 에 Scalr의 resize 라는 메서드로 이미지의 스케일을 조정하면 된다. 메모리 위에 올라와..

RESTful 웹 서비스 구축 - # Project 04 - 이미지 업로드 (9)

질문 17. 썸네일 이미지와 관련해서, 이미지의 크기 조정을 위해서 getThumbnail 이라는 메서드를 만들었다. 그 과정에서 의존성 주입을 해야 했다. 여기서는 Maven 이 아니라 Gradle 이라서 implementation 'org.imgscalr:imgscalr-lib:4.2' 를 의존성에 추가해주었다. 여기서 질문이, 다른 코드는 입력을 했다고 해서 새로 고침 버튼을 눌러줘야 하거나 그러지 않는데 왜 build.gradle 에다가 의존성을 추가했다고 해서 Gradle 의 새로 고침 버튼을 눌러줘야 하는거야? 그러니까 예를 들어서 java 파일에다가 함수가 하나 추가되었다고 해서 새로 고침 버튼을 눌러주지는 않는데 왜 Gradle 에 의존성을 추가하는건 새로  고침 버튼을 눌러주는거야? 똑같..

RESTful 웹 서비스 구축 - # Project 04 - 이미지 업로드 (8)

질문 16. 거의 마지막 즈음에 HashMap 을 만들어서, List 을 put 을 해줘서 result 라는 걸 만들어줬어. 근데 여기서 이해가 안 되는게, HashMap 을 그대로 return 할 때 사용하면 되는데, 왜 굳이 List 을 만들어서 response 를 return 할 때 사용했을까? 왜 그런거야? 아주 좋은 질문이에요! 😊질문을 보니 **"왜 굳이 HashMap을 바로 반환하지 않고, List으로 감싸서 반환했을까?"**가 궁금하신 거죠?이건 API 설계와 데이터 구조의 유연성 때문인데, 제가 차근차근 HashMap vs List의 차이와 왜 그렇게 설계했는지 이유를 알려드릴게요.✅ 1. 먼저 코드부터 다시 살펴보자🔧 코드 분석HashMap> result = new HashMap()..

RESTful 웹 서비스 구축 - # Project 04 - 이미지 업로드 (7)

질문 13. new File(path).getAbsolutePath()+"\\"+fileName; 이라고 했는데, 저기서 new 는 File 객체를 생성하는게 아니라 path 라는 String 문자열을 가지고 File 이라는 뭔가를 해주고나서, 그리고 나서 File이 가지고 있는 getAbsolutePath() 메서드를 이용해서 절대 경로 값을 뽑아낸 다음에 그 안에다가 fileName 에 해당하는 뭔가를 new 해준다는건가? 그러면 File 은 뭐야? Files 와 차이는 뭐야? 그리고 new 를 하긴 했는데, 정확히 뭘 new 해준거야? 뭘 생성해놓은거지? 이해할 수 있게 예시 결과값이라도 한 번 알려줘볼래? 아하! 질문 의도를 확실히 이해했어요. 😊말하고자 하는 핵심은 new File(path)가..

RESTful 웹 서비스 구축 - # Project 04 - 이미지 업로드 (6)

질문 11. RandomStringUtils 에서 random 메서드를 이용해서 문자와 숫자를 포함해서 랜덤 문자열을 생성할 수 있다는 걸 배웠다. 그러면 특수문자를 포함시켜서 랜덤 문자열을 만들 수도 있는건가?  **RandomStringUtils**의 random 메서드는 특수문자를 포함한 랜덤 문자열도 생성할 수 있습니다. 하지만 기본적인 random 메서드는 문자와 숫자만 생성하도록 설계되어 있으므로, 특수문자를 포함하려면 조금 다른 접근법이 필요합니다. 아래에서 상세히 설명할게요!1. RandomStringUtils.random 메서드의 기본 사용법RandomStringUtils는 Apache Commons Lang 라이브러리에서 제공하는 클래스입니다. 이 클래스의 random 메서드는 다음과 ..

RESTful 웹 서비스 구축 - # Project 04 - 이미지 업로드 (5)

질문 8. 개발한 프로그램에서 파일 이미지 업로드 REST API 가 @PostMapping("/{book_id}/{type}/upload") 이런식으로 했었어. 그렇다보니, 이미지 파일을 업로드할 때, book_id 가 만약에 1, 2, 3, 4 이렇게 여러 가지의 이미지를 대량으로 업로드하는 건 불가능해. 그냥 book_id 가 1에 해당하는 이미지들만 업로드가 가능하지. 그리고 거기서 여러가지의 이미지를 업로드할 수는 있긴 하지만, type 이 동일해야 해. type 을 입력해야 하다보니, type 은 1, 2, 3 밖에 없지만 1, 2, 3 을 동시에 업로드할 수가 없는거야. 당장 어떤 코드를 알고 싶다는건 아니지만, 내가 궁금한 건, type 이 1, 2, 3 이든 상관없고 book_id 도 1..

RESTful 웹 서비스 구축 - # Project 04 - 이미지 업로드 (4)

질문 4. resources 디렉토리에서, static, template 등의 폴더가 있는데, 거기서 새로운 디렉토리를 만들게 되면, static.uploads 이런식으로 표시가 되던데, 원래라면 디렉토리 아래에 새로 만들어진 디렉토리가 표시가 되어야 하는데, 왜 resources 디렉토리 아래에 있는 디렉토리들은 그 안에 새로운 디렉토리를 만들면 왜 그렇게 표시를 해주는건가?예를 들어서, src/main 에서 util 이라는 디렉토리를 만든다고 하면, .util 로 표시되는게 아니라 단독으로 디렉토리 아래에 표시가 되잖아. 왜 차이가 있는거지? 좋은 질문이에요! 이는 **IDE(통합 개발 환경)**와 Spring Boot의 프로젝트 구조에서 resources 디렉토리가 특별한 역할을 하기 때문입니다. ..

RESTful 웹 서비스 구축 - # Project 04 - 이미지 업로드 (3)

학습을 하다보면 질문이 참 많다. 그 질문에 스스로 답을 찾아나가는 것만으로도 공부가 많이 된다. 그런데 과거에는 chatGPT가 없었고 그래서 스스로 질문에 답을 찾는데에 굉장히 많은 시간이 들었고, 심지어 끝끝내 찾지 못 하는 경우도 있었다. 그런데 chatGPT가 나오고 나서, 학습하는데에 굉장히 많은 효율이 발생한다. 질문에 답을 찾는데에도 시간이 현격히 감소했고 심지어 답을 찾지 못 하는 경우는 거의 없다고 봐야 한다. chatGPT 유료 버전을 꽤 초기부터 사용해왔던터라 무료 버전은 어떤지 잘 모르겠지만, 유료 버전은 정말 "Awesome!" 그 자체다.여러 가지 분야들이 있겠지만, 개발 공부에 있어서는 정확도도 굉장히 높다는 생각이 든다. chatGPT와 MS의 관계는 굉장히 밀접한 관계이다..

RESTful 웹 서비스 구축 - # Project 04 - 이미지 업로드 (2)

지난 게시글에 작성했던 질문에 대한 답을 기록한다. 질문 1: @PostMapping의 {"multipart/form-data"}에서 {}는 무엇을 의미하나요?{}는 Java에서 배열(array)을 나타내는 문법이에요. consumes는 이 API가 처리할 데이터 형식(MIME 타입)을 배열로 받을 수 있습니다.예시:"application/json": 단일 값 (JSON 형식만 처리){"multipart/form-data"}: 배열 형식으로 하나 이상의 데이터 형식을 처리할 수 있음.여기서는 배열로 지정했기 때문에 확장성을 고려한 것으로 보입니다. 실제로 다른 형식도 추가하려면 배열에 더 넣을 수 있습니다:consumes = {"multipart/form-data", "application/json"}질..