분류 전체보기
-
EC2, REDIS,Docker로 CI/CD 구축하기백엔드 : 서버공부/Spring 2024. 7. 10. 23:34
방학동안 프로젝트를 진행하면서 깃허브 액션을 기반으로 CI/CD를 구축하는 파트를 담당하게 되었다.EC2, RDS 관련된 작업이라 여간 신경쓸게 한두가지가 아니다. 본 포스팅에선 설명하지않겠지만 CI/CD 가 정상적으로 이루어진줄 알았지만 EC2 인스턴스에 직접 접속하여 로그를 살펴보니 RDS연결이 계속 실패했던 문제도 있었다..(인바운드, 아웃바운드 규칙을 구글링결과처럼 모든 외부에게 허용 등을 하여도 안됬었는데.. private ip를 규칙에 추가하고, 아래보이는 컴퓨팅 리소스에 사용중인 EC2 인스턴스를 연결하니 해결되었다. 그런데 문제가 또있었다. 우리 프로젝트는 JWT 토큰을 레디스 서버에 저장하여 관리한다. 그렇기 때문에 레디스서버와 스프링서버가 동시에 작동중이어야 한다!개발환경인 로컬환경에서..
-
<스프링 기초 - 자바> 2차원 배열 정렬백엔드 : 서버공부/Spring 2024. 5. 23. 12:35
이차원 배열 메소드의 원리에 대해 기록하려고 작성하는 글 자바에서 1차원 배열의 정렬은 아주 간단하다. Arrays.sort메소드를 사용하면 된다. 2차원 배열이라는 문제상황에서도 Arrays.sort는 유효할까? 아마 날먹(?)의 마음으로 이차원 배열을 Arrays.sort 인자로 넣으면 아래같은 문제를 맞이했을것이다.Arrays.sort(나는 2차원 배열) ClassCastException 예외가 발생하는 이유는 Arrays.sort 메소드가 2차원 배열을 위한 Comparable 인터페이스를 구현하지 않은 배열을 정렬하려고 하기 때문이다. ComparableTimSort는 Comparable을 구현한 객체들을 정렬할 때 사용됩니다. 만약 객체들이 Comparable을 구현하지 않았다면, Compa..
-
레디스 도입하기 [기초]백엔드 : 서버공부/Spring 2024. 5. 5. 15:45
최근 개인 공부용으로 프로젝트를 진행 중인데요, https://github.com/Mouon/issuehub이번에는 캐싱을 도입해보았습니다.도입한 이유는 데이터베이스에 부하가 걸리는 것을 최소화해보기 위해서입니다.이를 위해 레디스를 도입해보기로 하였구요 이를 통해 데이터를 캐시로 저장하고 빠르게 접근할 수 있도록 해보겠습니다. 캐시 도입시 간단한 흐름을 보면 아래와 같습니다.클라이언트가 요청을 보내면, 서버에서 해당 요청에 대한 데이터를 레디스 캐시에서 검색합니다.캐시에 데이터가 존재하면, 캐시된 데이터를 클라이언트에 반환합니다.캐시에 데이터가 존재하지 않으면, 데이터베이스나 다른 소스에서 데이터를 가져와서 캐시에 저장한 후 클라이언트에 반환합니다.데이터베이스나 다른 소스에서 가져온 데이터는 캐시에 저..
-
동전 1 [자바]백준 2024. 3. 24. 17:38
https://www.acmicpc.net/problem/2293 2293번: 동전 1 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. www.acmicpc.net 동전 1 성공 시간 제한메모리 제한제출정답맞힌 사람정답 비율 0.5 초 (추가 시간 없음) 4 MB 63372 29829 22743 47.109% 문제 n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다. 이 동전을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오. 각각의 동전은 몇 개라도 사용할 수 있다. 사용한 동전의 구성이 같은데, 순서만 다..
-
스프링 : DTO를 사용하는 이유백엔드 : 서버공부/Spring 2024. 3. 7. 15:47
애플리케이션을 개발할 때, 데이터를 UI에서 서버로, 서버에서 DB로 전달해야 하는 경우가 자주 있습니다. 이러한 경우, 직접 엔티티를 사용하여 데이터를 전달하는 것이 아니라, DTO를 사용해야 하는 여러 가지 이유가 있습니다. 1. API 스펙의 안정성 그 중 가장 큰이유는 API 스펙의 안정성입니다. 엔티티를 그대로 api에서 사용할 경우 엔티티의 수정이 api의 스펙 변화로 이어지게 됩니다. 이렇게 되면 api를 사용해 개발하는 클라이언트측에서 개발중 api가 작동하지 않는 문제를 경험할 수 있습니다. 2. 유연한 API 개발 또 다른 이유 하나는 유연한 API의 개발이 있겠습니다. 클라이언트의 요구 사항은 시시각각 변할 수 있습니다. 클라이언트 측에서 필요로 하는 데이터 형태가 변하더라도, DTO..
-
스프링 : 세터(setter) 사용시 문제점백엔드 : 서버공부/Spring 2024. 3. 2. 15:57
이번 포스팅은 특별한 내용이 아니라, 김영한님의 강의의 내용중에 개발시 앞으로 기억해야할 부분이 있어서 기록용으로 작성하게 되었습니다. 혼자 스프링부트에서 엔티티를 다룰 때, '세터(setter)' 메서드를 통해 객체의 상태를 변경하는 방식으로 코드를 작성할 때가 있습니다. 예를 들어, `setName()`, `setAge()`, `setEmail`와 같은 메서드들이 그 예입니다. 이러한 방식은 간단하고 직관적으로 보일 수 있으나, 객체의 상태 변경을 추적하기 어렵게 만들 수 있는 단점이 있습니다. 협업을 하거나 나중에 프로젝트 규모가 커지면 어느지점이 변경지점인지 찾기 어려워서 유지보수성이 떨어질 수 있습니다. 세터(setter)를 통한 상태 변경의 문제점 1. 변경 포인트 추적의 어려움: 객체의 상태..
-
스프링 : BindingResult 를 통한 에러 처리해보기백엔드 : 서버공부/Spring 2024. 2. 19. 15:39
웹사이트에서 사용할 회원가입기능을 구현한다고 생각해봅시다. 여기서 설계를 할때 이름은 필수로 입력받도록 처리했다는 가정을 해보겠습니다. 코드로 서의 구현은 다음과 같습니다. @Getter @Setter public class MemberForm { /** * 이 어노테이션을통해 값이 비어있으면 오류가 발생하게 해줍니다 * */ @NotEmpty(message = "회원 이름은 필수 입니다") private String name; private String email; private String age; } @NotEmpty 어노테이션을 통해 name 필드에 어떠한 값도 넘어오지않으면, 유효성 검사 오류를 터뜨리도록 하였습니다. 그런데 이렇게 처리하면 문제가 있습니다. 클라이언트 측에서 이름을 누락하고 값..
-
스프링 : Java 스트림의 map() 메서드 사용백엔드 : 서버공부/Spring 2024. 2. 13. 23:13
스프링과 직접적으로 관련있는 글은 아니지만, 제가 자주 사용하게 되는 문법이라 기록해두고자 작성하게 되었습니다. 오늘 기록할 문법은 map() 메서드입니다. Java 8부터는 stream 통해 간편하고 효율적으로 데이터를 처리할 수 있습니다. 그 중에서도 map() 메서드는 스트림의 각 요소를 다른 요소로 변환하는 데 사용됩니다. 사용법 map() 메서드의 기본적인 사용법은 다음과 같습니다. stream.map(element -> 변환식) 여기서 stream은 스트림 객체를 나타내며, element는 스트림의 각 요소를 가리키는 변수입니다. 변환식은 각 요소를 변환하는 데 사용됩니다. 이 변환식은 람다 표현식으로 표현되며, 다음과 같은 구조를 가집니다. (element) -> { 변환 로직 } eleme..