본문 바로가기
반응형

전체 글313

[Java] 컬렉션 팩토리 : of Java에서 소수의 데이터를 가지는 고정된 크기의 리스트를 선언하려면 어떻게 해야 할까? 예를 들어 1, 2, 3 정수형 데이터를 가지는 리스트를 선언할 경우 다음과 같이 리스트 객체를 선언 후 add() 메서드를 통해 정수형 데이터를 입력해줄 것이다. List list = new ArrayList(); list.add(1); list.add(2); list.add(3); 하지만 이 방법은 데이터마다 add() 메서드를 타이핑해야 하는 번거로움이 존재하며 선언된 리스트는 고정된 크기의 리스트가 아니다. 이는 Arrays.asList() 팩토리 메서드를 이용하면 코드를 더욱 간단하게 줄일 수 있으며 고정된 크기의 리스트가 보장된다. List list = Arrays.asList(1, 2, 3); 실제로 l.. 2021. 9. 26.
[Spring] Bean Validation 특정 필드에 대해 검증해야 할 경우가 발생할 수 있다. 예를 들어 회원가입 기능을 구현한다고 해보자. 이름(String)과 나이(Integer)는 값이 무조건 입력되어야 하는 필수요소라고 하자. 클라이언트의 실수로 값을 입력하지 않는 경우, 범위를 벗어나거나는 경우, 나이에 Integer가 아닌 String 타입의 값을 입력하는 경우 등 잘못된 상황이 발생할 수 있다. 이때 우리는 검증을 통해 클라이언트에게 잘못된 값을 입력하였다는 것을 알려줄 수 있어야 한다. 그래야 클라이언트는 올바른 값을 입력할 것이기 때문이다. 이는 BindingResult를 활용하면 해결할 수 있다. 하지만 FieldError나 ObjectError를 통해 매번 코드로 검증 기능을 작성하는 일은 상당히 번거로울 수 있다. 특히 .. 2021. 9. 23.
백준 2075 : N번째 큰 수 https://www.acmicpc.net/problem/2075 2075번: N번째 큰 수 첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다. www.acmicpc.net [ 문제풀이 ] 구하고자 하는 것이 N번째로 큰 수이기 때문에 최소 힙 형태의 우선순위 큐를 활용하여 N개의 큰 수를 관리해주면 된다. 우선순위 큐 크기가 N보다 작을 때는 수를 삽입해주고, N개일 때부터는 현재 수가 최솟값보다 큰 경우 갱신해주면 된다. import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputSt.. 2021. 9. 18.
[Spring] @PostConstruct에서 @Transactional 처리 시 문제점 간단한 웹 프로젝트를 진행하고 있는데 테스트할 때마다 매번 DB에 데이터들을 추가해줘야 하는 번거로움이 존재하였다. 이를 해결하기 위해 TestData이라는 클래스를 스프링 빈으로 등록한 후 init() 메서드에 @PostConstruct를 적용하여 TestData 빈이 스프링 컨테이너에 등록될 때 자동으로 테스트 데이터를 DB에 추가하도록 하였다. Member, MemberService, MemberRepository 클래스는 다음과 같이 구현되어 있다. MemberService에는 @Transactional을 걸어주었고, MemberRepository에는 @Transactional을 걸어주지 않았다. @Getter @Setter @Entity public class Member { @Id @Gener.. 2021. 9. 17.
[Spring] 양방향 매핑시 주의점 : toString 이름과 나이를 멤버 변수로 가지는 Member라는 클래스가 있다고 하자. public class Member { private String name; private int age; //Getter & Setter } Member의 정보를 눈으로 확인하고 싶은 경우 다음과 같은 방식을 사용할 것이다. System.out.println("Member [name=" + member.getName() + "] [age=" + member.getAge() + "]"); 하지만 이 방법은 매번 코드를 작성해야 하는 번거로움이 존재한다. 이는 toString() 메서드를 재정의하여 재사용하는 방식으로 해결해줄 수 있다. @Override public String toString() { return "Member{" .. 2021. 9. 15.
백준 12738 : 가장 긴 증가하는 부분 수열 3 https://www.acmicpc.net/problem/12738 12738번: 가장 긴 증가하는 부분 수열 3 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000) www.acmicpc.net [ 문제풀이 ] 전형적인 LIS를 구하는 문제이다. 일반적으로 LIS는 DP로 구하지만 N이 최대 1,000,000이기 때문에 O(N^2)의 시간 복잡도로는 해결할 수 없다. 이는 세그먼트 트리나 LowerBound를 활용하면 O(NlogN)의 시간 복잡도로 해결할 수 있다. 나는 구현하기 더 간단한 LowerBound로 해결하였다. 다만, LowerBound를 활용.. 2021. 9. 12.
[Spring] AOP가 적용되지 않은 메서드에서 AOP가 적용된 메서드를 호출하면 AOP가 정상적으로 동작할까? Spring AOP를 공부하던 도중 "AOP가 적용되지 않은 메서드에서 AOP가 적용된 메서드를 호출하면 AOP가 정상적으로 동작할까?"라는 의문을 가지게 되었다. 이를 알아보기 위해 코드를 작성하고 여러 가지 테스트를 실행해보자. 먼저 어노테이션 기반의 단순한 @TestExecution을 선언하자. @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestExecution { } @Aspect @Component public class TestAspect { @Around("@annotation(TestExecution)") public Object logExecutionTime(ProceedingJoinP.. 2021. 9. 11.
[Spring] AOP란? 스프링 프레임워크에는 스프링 트라이앵글이라는 것이 존재한다. 이는 스프링 프레임워크의 핵심 요소를 나타내는 것인데 이 중 하나인 AOP에 대해서 알아보도록 하자. AOP는 Aspect-Oriented Programming의 약자로써 그대로 번역하면 관점-지향 프로그래밍을 의미한다. 그렇다면 관점이라는 것이 무엇을 의미하는 것일까? 이는 말보다 그림으로 이해하는 것이 편하다. A, B, C의 클래스가 존재한다고 해보자. 각 클래스는 특정 로직을 수행하는 메서드를 하나씩 가진다. 그런데 성능 측정을 위해서 메서드가 수행되는 시간을 측정해야 하는 요구사항이 들어왔다고 생각해보자. 가장 단순한 방법은 A, B, C 클래스에 시간 측정 로직을 모두 넣는 방법일 것이다. 근데 이 방법은 상당히 비효율적이다. 매번 .. 2021. 9. 9.
백준 11085 : 군사 이동 https://www.acmicpc.net/problem/11085 11085번: 군사 이동 전쟁 당시 Baekjoon World의 국왕은 Cube World를 공격할 작전을 세운 적이 있습니다. Baekjoon World와 Cube World는 p개의 지점과 w개의 길로 표현됩니다. 모든 길은 양방향이며, 각 길마다 너비가 존재하여 www.acmicpc.net [ 문제풀이 ] 크루스칼 알고리즘을 활용해서 c, v가 연결될 때까지 가장 넓은 길부터 차례대로 연결해주면 되는 문제이다. import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWr.. 2021. 9. 8.
반응형