본문 바로가기

전체 글135

[백준] 14502 연구소 / java https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net 문제 풀이 이 문제는 BFS 카테고리의 문제 목록에서 발견했지만 실상은 BFS와 DFS를 복합적으로 사용해야 하는 문제였다. 각각이 사용되는 부분은 아래와 같다. DFS: 벽을 3개 세우는 경우의 수 탐색 BFS: 위 DFS에서 찾은 각 경우에 대해 바이러스를 퍼뜨리는 과정 탐색 다시 말해, DFS로 BFS를 할 케이스를 골라내는 것이다. 더불어 유의할 점으로 Deep Copy와 Swallow Copy의 차이.. 2023. 5. 29.
@Builder의 선언위치에 따른 차이 @Builder의 선언위치 @Builder는 Class에 선언할 수도 있고, Class의 Constructor에 선언할 수도 있다. Class에 선언 @Builder public class Person { private int id; private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } } 위와 같이 Class에 @Builder를 선언할 경우 문제점이 있는데, 아래 이미지처럼 Class의 모든 필드가 builder에 노출된다는 것이다. 인스턴스를 생성할 때 인자로 받고 싶지 않은 필드가 있을 경우, @Builder를 Constructor에 선언함으로써 해결할 .. 2023. 5. 26.
[Java / Stream] 정수 배열(int[])을 해시맵으로 변환하기 / Collectors.toMap() 활용 예제 상황 다음과 같은 정수 배열 arr가 있을 때, 이 배열의 원소 별 count를 담는 해시맵을 만들고자 할 때 Collectors.toMap() 메서드를 활용할 수 있다. 결과로서의 arrMap은 다음과 같은 Key : Value 쌍을 이룰 것이다. - 1 : 3 - 2 : 2 - 3 : 1 int[] arr = {1, 1, 1, 2, 2, 3}; Map arrMap = Arrays.stream(arr) .boxed() .collect( Collectors.toMap( x->x, x->1, Integer::sum)); toMap() 메서드 살펴보기 아래는 toMap()의 선언부이다. 인자로서 keyMapper, valueMapper, mergeFunction을 받는다. 이때 mergeFunction.. 2023. 5. 20.
[Stream 예제] int[]의 중복 원소 제거 (Set 활용) 다음과 같은 int 배열 arr가 있다고 가정했을 때, Set 자료구조의 특성을 활용하여 중복된 원소를 제거할 수 있다. int[] arr = new int[]{1, 2, 3, 2, 1}; // array -> set -> arrayList ArrayList distinct = new ArrayList( Arrays.stream(arr) .boxed() .collect(Collectors.toSet())); 2023. 5. 12.
[Spring Boot] 인증과 인가 0. 개요 서비스 운영에 있어서의 보안과 관련된 개념을 알아본다. 스프링에 보안을 적용할 때 사용하는 Spring Security에 대해 알아본다. 무상태(stateless) REST 애플리케이션 환경에 맞게 토큰값을 활용하는 보안 기법을 기본적으로 가정한다. * stateless: 클라이언트와 서버 관계에서 서버가 클라이언트의 상태를 보존하지 않음 1. 인증과 인가는 무엇인가? 인증과 인가. 한국어로든 영어로든 서로 비슷해서 헷갈린다. 하지만 찬찬히 생각해보면 어감의 차이를 느낄 수 있다. 먼저 인가를 보면 '허락'의 뉘앙스가 풍긴다. 이를 중심으로 생각해보면 좀더 구분이 수월해지기도 한다. 놀이공원에 간 상황을 예로 들면, 놀이공원 입구에서 신분을 확인하여 입장하는 것이 인증이다. 그리고 입장 과정에.. 2023. 4. 29.
[Spring Boot] 서버 간 통신: RestTemplate과 WebClient 1. 서버 간 통신의 필요성 MSA(MicroService Architecture)의 등장 소프트웨어의 모든 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Architecture는 서비스의 규모가 커질 수록 유지 보수 측면에서의 한계를 보인다. 이러한 문제를 보완하기 위해 하나의 애플리케이션이 하나의 기능만을 가지도록 구성한 형태인 MicroService Architecture가 등장하였다. 애플리케이션은 자신이 가진 기능을 API로 외부에 노출하고, 다른 서버(애플리케이션)가 그 API를 호출하여 사용한다. 이 과정에서 다른 서버로 웹 요청을 보내고 응답을 받을 수 있게 도와주는 기술이 RestTemplate과 WebClient이다. 2. RestTemplate 개요 RestTemplat.. 2023. 4. 22.
[Spring Boot] 액추에이터 1. 액추에이터(Actuator)란? 스프링 공식 문서에서는 위와 같이 설명하고 있다. 즉, 스프링 부트 액추에이터는 HTTP 엔드포인트나 JMX를 사용해 애플리케이션을 관리하고 모니터링할 수 있는 기능을 제공한다. * JMX(Java Management Extensions) : 실행 중인 애플리케이션의 상태를 모니터링하고 설정을 변경할 수 있게 해주는 API 2. 액추에이터 사용을 위한 의존성 액추에이터 기능을 사용하려면 spring-boot-starter-actuator 모듈의 의존성을 추가해야 한다. 다음은 build.gradle 예시이다. implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator' 3... 2023. 4. 21.
[Spring Boot] 유효성 검사와 예외처리 1. 유효성 검사 1.1. 스프링 부트에서의 유효성 검사 먼저 유효성 검사를 위한 프레임워크가 없던 시절의 유효성 검사에 대해 살펴보면 몇가지 문제점이 있다. 계층별로 진행하는 유효성 검사는 검증 로직이 각 클래스별로 분산돼 있어 관리하기가 어렵고, 검증 로직에 중복이 많아 코드의 효율성이 떨어진다. 이 같은 문제를 해결하기 위해 자바 진영에서는 Bean Validation이라는 데이터 유효성 검사 프레임워크를 제공하기 시작했다. 이는 어노테이션을 통해 검증을 진행하여 개발자가 직접 검증 로직을 구현할 필요가 없게 되었다. 유효성 검사는 아래 이미지와 같이 각 계층으로 데이터가 넘어오는 시점에 해당 데이터에 대한 검사를 진행한다. 계층 간 데이터 전송에 대체로 DTO를 사용하고 있기 때문에 DTO를 대상.. 2023. 4. 14.
[Spring Boot] 연관관계 매핑 1. 객체 연관관계 vs 테이블 연관관계 객체 객체는 참조를 통해 연관관계를 맺는다. 참조를 통한 연관관계는 단방향이다. 즉, 객체에서의 양방향은 두 엔티티가 서로 단방향 연관관계를 갖고 있는 것이다. 테이블 테이블은 외래키로 연관관계를 맺는다. 외래키를 통한 연관관계는 언제나 양방향이다. 외래키가 있으면 해당 키를 중심으로 A JOIN B와 B JOIN A 모두 가능하기 때문이다. 2. 연관관계 매핑 종류 2. 1. 일대일(One To One) 매핑 2. 1. 1. 일대일 단방향 매핑 public class Member { ... @OneToOne @JoinColumn(name = "member_detail_id", referencedColumnName = "id") private MemberDetai.. 2023. 4. 9.
[Spring Boot] 테스트 코드 작성 1. 테스트 코드를 작성하는 이유 개발 과정에서 문제를 미리 발견할 수 있다. 일부러 오류를 발생시켜 의도한대로 예외 처리가 수행되는지 확인 의도한 비즈니스 로직대로 결과값이 잘 나오는지 확인 리팩토링의 리스크가 줄어든다. 서비스 업데이트 과정에서 코드를 수정하면 그와 연관된 다른 코드에 영향을 주기 마련이다. 이때 작성되어 있는 테스트 코드를 실행해봄으로써 일련의 과정을 보다 수월하게 수행해볼 수 있다. 명세 문서로서 기능할 수 있다. 잘 작성된 테스트 코드를 보면 특정 로직에 어떤 값을 입력하면 어떤 값이 반환되는지를 이해할 수 있다. 이를 통해 코드 작성자의 의도를 다른 개발자가 이해하기 수월하게 만들 수 있다. 2. 단위 테스트와 통합 테스트 2. 1. 단위 테스트 일반적으로 메서드 단위의 테스트.. 2023. 3. 31.
[Spring Boot] 스프링 부트와 데이터 베이스 연동 1. ORM ORM(Object Relational Mapping)은 객체지향프로그램에서의 객체(Objects)와 관계형 데이터베이스의 테이블을 자동으로 매핑하는 기술이다. 이를 이용하여 개발자는 DB에 대한 쿼리문이 아닌 자바 코드(메서드)로 DB의 데이터를 조작할 수 있다. 1.1. 장점 데이터베이스에 대한 종속성이 줄어든다. 데이터베이스 교체 시에 비교적 적은 소요 발생 복잡한 쿼리 작성에 대한 소요를 줄임으로써 비즈니스 로직 개발에 더욱 집중할 수 있다. 1.2. 단점 객체지향프로그램의 객체와 데이터베이스의 테이블 사이의 관점 불일치가 발생한다. 상속: RDMS에는 상속의 개념이 없다. 연관관계: 자바에서는 객체를 참조함으로써 연관성을 나타내지만 RDBMS에서는 외래키를 삽입함으로써 연관관계를 맺.. 2023. 3. 27.
[Spring Boot] HTTP 요청을 위한 API 작성법 0. HTTP Method Http 메서드란 Client와 Server 사이에서 이루어지는 요청(Request)과 응답(Response) 데이터를 전송하는 방식이다. 메서드의 종류에는 총 아홉 가지가 있으나 아래 나열한 네 가지 메서드가 주로 사용된다. 1. GET - 내용 취득 2. POST - 내용 저장 3. PUT - 내용 전체 갱신 4. DELETE - 내용 삭제 다음으로는 Spring Boot 프로젝트에서 위 메서드들에 대한 API를 작성하는 방법이다. 먼저 메서드들이 담길 컨트롤러 클래스를 생성하고 그 컨트롤러에 @RestController를 붙여줌으로써 요청에 대한 응답값으로 JSON 형태의 데이터를 반환할 수 있도록 해준다. 그리고 필요하다면 @RequestMapping을 통해 해당 컨트롤.. 2023. 3. 18.