1. n을 고려하여 알고리즘 짜보기
기존에는 case로 주어지는 n의 범위를 고려하지 않고, 알고리즘을 풀었는데 n의 범위 고려하여 로직의 시간복잡도가 1억연산횟수를 넘지 않게 해야한다는 조언을 들었다. 적용해볼 일이 많지 않아서, 사실 아무생각없이 코드를 짜다가 오늘나온 문제가 이런 상황을 고려해야했다.
문제 링크 에 들어가보면 n 의 범위가 이라고 적혀있는데, 이말인 즉슨 이중for 문을 사용하는 즉시 연산 수가 1억이 넘어가는 케이스가 발생한다느 것이다.
하지만, 이 문제의 경우 2차원 배열을 사용해야하는 문제였고, 처음 마주했을 때는 막막했지만 문제를 계속 보다보니, 특정한 규칙이 보였다. 2가지의 규칙을 발견할 수 있었는데, 1번째는 해당 값이 x,y 좌표라고 쳤을 때 x, y값중 큰값의 + 1 이 셋팅된다는 것이었다. 또한 2번째는 일차원 배열 인덱스로 x, y의 값을 곧바로 구할 수 있다는 것인데, x의 경우에는 n 이상을 채워야 row가 바뀔 수 있기 때문에 i/n이고, y의 경우 계속 같은 인덱스를 반복하기 때문에 i % n 로 값을 구할 수 있다.
즉, 이렇게 되면 이중 반복문을 거치지 않고 곧바로 값을 구할 수가 있는 것이다.
여태껏 n의 범위를 생각하지 않아도 문제가 풀렸었지만, 앞으로는 n의 범위를 고려하며 문제를 풀 수 있도록 노력해야겠다는 생각을 했다.
2. 우당탕탕 JPA 심화
- 스프링 데이터 : 스프링을 위한 다양한 데이터 저장소 연동 및 최적화 패키지
- 스프링데이터 jpa는 스프링 데이터의 한 종류이다.
- 스프링 데이터 common에 Respository + CrudRepository(save, exist, count, delete) + PagingAndSortingRepository 가 있고, 이것들을 영속성을 관리하는 기능들을 가진 JpaRepository가 상속받아 SimpleJapRepository를 생성해준다.
- JpaRepsotory는 Bean이 아니다. 그러면 어떻게 Bean으로 등록되는걸까?
@SpringBootApplication을통해 @EnableJpaRepository가 등록되고, 이것은 JpaRepository에 엔티티와 엔티티아이디의 타입을 넘겨주면 자동으로 SimpleJpaRepository를 Bean으로 등록해준다. - @RepositoryDefinition을 이용하여, 사용해야할 메서드를 제한 할 수 있다.
이걸 주입하면, JpaRepository를 implement해줄 필요없음 -
@NoRepositoryBean을 이용해 인터페이스를 구현한 뒤, 그것을 상속받아도 똑같이 제한가능하다.
| application transaction DB transaction |
서비스 -> (persist) -> 1차캐시 -> (flush) -> DB Transaction -> (commit) -> DB
롤백은 어플리케이션단과 DB단 모두에서 발생할 수 있고, 롤백이 어디에서 발생하느냐에 따라 분류가 아예다르다.