데브옵스 36

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"}질..

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

지금까지 Book 이라는 table 만 가지고, GET/POST/PUT/DELETE 를 해볼 수 있는 RESTful을 만들어봤었다.직전 게시글에서 전역 예외 처리에 대해서 공부했고,이제는 Book 이라는 table 말고도 다른 table 도 만들어볼 것이고, 그 table 간의 관계 설정도 해볼 것이다.책과 관련된 이미지를 업로드, 다운로드, 삭제 등을 RESTful API로 만들어볼 것이다. Book 이라는 Entity 를 만들었었다. 이제는 BookImage 라는 Entity 를 만들것이다. (table 이 될 것)책 하나에는 여러개의 책 이미지가 있을 수 있다. 교보문고 같은 책 판매 페이지를 보면, 알 수 있듯이 여러 개의 이미지가 등록되어 있을 수 있다. 그러므로 1:N 의 관계를 맺게 된다.B..

RESTful 웹 서비스 구축 - @ControllerAdvice / @ExceptionHandler

간단한 REST API 를 만들어봤었다.추가적인 REST API 들을 만들어보기 전에, 예외 처리와 관련된 공부를 하고 가자.프로그램 개발과 예외 처리프로그램 개발 과정에서 **예외(Exception)**는 예상치 못한 상황에서 자주 발생합니다. 이러한 예외를 처리하는 방법은 다양합니다:try-catch를 이용한 예외 처리개별 코드 블록에서 발생할 수 있는 예외를 직접 처리합니다.try { // 예외 발생 가능성 있는 코드} catch (Exception ex) { // 예외 처리 코드}예외를 호출한 곳으로 전달 (throws)특정 메서드에서 발생한 예외를 호출한 메서드로 던질 수 있습니다.이를 위해 throws 키워드를 사용합니다. 예외를 직접 처리하지 않고 위임하는 방식입니다.public ..