
일급 컬렉션이란 Collection을 Wrapping하여 다른 멤버 변수는 없는 특징을 갖고 있습니다. 저는 DTO를 일급 컬렉션으로 만들었는데, request, response 할 때 직렬화, 역직렬화를 설정하는 방법을 설명하겠습니다. 일단 예제를 위해 게시글을 등록하기 위한 request dto부터 소개하겠습니다. 게시글 제목, 내용, 이미지에 대한 정보들을 가지고 있습니다. 이미지에 대한 정보들이 ImageCreateRequest이며 우리가 앞으로 중점으로 봐야할 일급 컬렉션입니다. @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class PostCreateRequest { private String title; private St..
이어서 이미지 불러오기에 대해 설명해보겠다. 이미지 저장에서 설명한 FileUtil 클래스를 이용하며, 전체적으로 코드가 간단하므로 먼저 코드부터 나열하겠다. @RestController @RequiredArgsConstructor public class ImageLoadController { private final ImageLoadService imageLoadService; @GetMapping("/uploads/images/{imageName}") public ResponseEntity load(@PathVariable String imageName) { ImageResponse image = imageLoadService.load(imageName); return ResponseEntity.ok..
프로젝트 내에서 게시글 이미지를 저장하고 불러와야 했다. 아직은 클라우드 서비스를 이용할 생각이 없어서 로컬 저장소를 이용하기로 했다. 아래 글을 많이 참고하였다. https://spring.io/guides/gs/uploading-files/ Getting Started | Uploading Files To start a Spring Boot MVC application, you first need a starter. In this sample, spring-boot-starter-thymeleaf and spring-boot-starter-web are already added as dependencies. To upload files with Servlet containers, you need to..
이번에 FE 1명, BE 1명(본인) 총 2인으로 프로젝트를 시작했다. FE 분이 직접 백엔드 어플리케이션을 실행 환경을 구축하기엔 어려움이 따를 것 같아 docker compose로 환경 구축하기로 결정했다. (실제로 FE분은 자바를 까는 것을 꺼려했다.) 백엔드 서버는 spring boot application과 mysql을 사용하고 있다. 서버 어플리케이션 컨테이너와 mysql 컨테이너를 정의하였고 실행해본 결과 문제가 없어서 FE분에게 내용을 전달했다. 하지만 문제가 계속 계속 터졌다. 처음에 작성한 파일은 아래와 같았다. Dockerfile에서 서버 어플리케이션을 build하여 jar파일로 만든 후 jar 파일을 실행 docker compose 파일 내 mysql container와 서버 어플리..
이번에 프로젝트를 시작하면서 docker로 database 환경 구축했습니다. database는 mysql을 사용하고 로컬 개발용 db과 테스트용 db로 나눴습니다. 두 개의 database를 구성하기 위해서 port와 env file 경로를 다르게 명시해주었습니다. 아래는 docker compose 파일과 env 파일 예시입니다. 홈 디렉토리({home directory})는 비워두었습니다. # docker-compose.yml version: '3.8' services: dev-db: image: 'mysql:8.0' ports: - '3306:3306' command: --default-authentication-plugin=mysql_native_password env_file: - .env.de..

call by value, call by reference라는 단어를 종종 들어봤지만, 들어만 보고 정확하게 알지 못해서 정리해봤다. 다른 사람들도 많이 정리해놓은 내용들이라 거의 비슷하긴 하지만 직접 해보면서 더 확실히 머릿속에 정리할 수 있었다. 실험의 흐름은 아래와 같다. person 객체를 생성한다.(name과 age를 멤버 변수로 갖는다.) person 객체의 age(int) 값을 파라미터로 넘겨서 값을 변경하면 변화가 있는지 확인한다. person 객체를 파라미터로 넘겨서 age 값을 변경하면 변화가 있는지 확인한다. person 객체를 파라미터로 넘겨서 새로운 person 객체를 재할당하고 변화가 있는지 확인한다. 실험에 앞서 person 클래스를 소개하겠다. person 클래스는 멤버변수로..
자바 컴파일러가 서로 상응하는 primitive type과 wrapper class 끼리 자동 변환해주는데, 이것을 각각 autoboxing과 unboxing 이라고 부른다. autoboxing과 unboxing에 용어에 대해서 하나씩 알아보자. autoboxing primitive value 를 상응하는 wrapper class의 객체로 변환하는 것 Ex) int -> Integer, double -> Double autoboxing 하는 경우 호출할 때 primitive value를 전달하지만, method의 parameter가 wrapper class 객체 일 경우 public static void main(String[] args) { doSomeThing(0); } private static v..

유전 법칙 문제 링크 정답 코드 class Solution { public String[] solution(int[][] queries) { String[] result = new String[queries.length]; for(int i = 0; i < queries.length; i++) result[i] = queries[i][0] == 1 ? "Rr" : recursive(queries[i][0], queries[i][1]); return result; } private String recursive(int n, int p) { int cnt = (int) Math.pow(4, n - 1); if(p cnt / 4 * 3) return "rr"; if(n == 2) return "Rr"; if(..
외톨이 알파벳 문제 링크 정답 코드 import java.util.*; import java.util.stream.*; class Solution { public String solution(String input_string) { Map flag = new HashMap(); String[] input = input_string.split(""); String answer = ""; int i = -1; while(++i < input.length) { int j = i; while(j < input.length && input[i].equals(input[j])) j++; if(flag.getOrDefault(input[i], false)) answer += input[i]; if(i != j) i ..
체육대회 문제 링크 정답 코드 import java.util.stream.IntStream; class Solution { int[] board = new int[11]; int result; public int solution(int[][] ability) { for(int i = 0; i < ability.length; i++) board[i] = i; permutation(0, ability); return result; } private void permutation(int depth, int[][] ability) { int r = ability[0].length; if(depth == r) { result = Math.max(result, IntStream.range(0, r).map((i) ..