서론 Spring + JPA를 사용해 진행 중인 프로젝트에서 bulk insert가 필요한 상황이 생겼다. bulk라기엔 민망한 최대 300개 데이터이긴 하지만, JpaRepository의 saveAll 메서드를 호출해 저장 시 300개의 insert 쿼리가 따로 나간다는 점이 조금 마음에 걸렸다. 사실상 saveAll은 사용하지 말자는 것은 정해진 듯 보였고, 다음 고민거리는 대체자로 무엇을 사용할 것인가였다. 가장 일반적으로 사용되는 대안은 JdbcTemplate이었으나, 아예 문자열로 쿼리를 박아버리는 방식 자체가 찝찝해 다른 방법이 있는지 찾아보고 있던 상황이었다. 그러던 중 친구랑 나눈 대화가 실험욕구를 자극했다. 본론 그래서 JPARepository.saveAll과 JdbcTemplate.ba..
분류 전체보기
자바는 null값을 적절하게 처리하도록 하기 위해 Optional 이라는 Wrapper 클래스를 제공한다. Optional 클래스의 기능 중 orElse() 와 orElseGet() 은 모두 Optional로 가져온 값이 null일 경우, 해당 값을 무엇으로 대체할지 결정해주는 메서드이다. 지금까지 두 메서드의 차이점을 어렴풋이만 알고 정확히는 모른 채 Supplier로 써주기 귀찮다는 이유로 orElse()를 주로 사용해왔는데, 사실은 굉장히 위험하고 생각없는 짓이었다. orElse()와 orElseGet()은 모두 Optional의 값이 null인 경우 사용자가 지정한 다른 값을 넘겨주는 용도이다. 핵심적인 차이점은 파라미터로 받는 값이 T와 Supplier라는 것이다. 이게 뭐? 라고 생각할 수 있..
메일 서버 동작 구조 메일이 송신자를 떠나 최종 수신자에게 도달하는 대략적인 구조는 위 그림과 같다. 먼저, 송신자는 메일 송신 프로토콜인 SMTP를 통해 메일 데이터를 메일 발신 서버인 abc.com에 전송한다. 메일을 받은 abc.com은 메일 데이터에 포함된 수신자의 메일 서버의 IP를 DNS를 통해 조회하고, 동일하게 SMTP를 사용해 데이터를 해당 서버에 전송한다. 이렇게 전송된 데이터는 메일 수신 프로토콜인 POP3 혹은 IMAP를 사용해 최종 수신자에게 전달된다. 메일 송수신에 사용되는 프로토콜 1) SMTP (Simple Mail Transfer Protocol) 메일 송신을 위해 사용되는 프로토콜 사용 케이스 메일을 송신하고자 하는 사용자가 MTA(Mail Transfer Agent)를 ..
문제 상황 엔티티의 속성을 수정, 저장 후 수정사항이 반영되었는지 확인하기 위해 재조회할 때 변경 내용이 반영되지 않은 채로 데이터가 조회되는 상황이 발생했다. 보다 구체적을 설명하면, 엔티티를 Soft delete하고 난 후 Repository를 통해 다시 해당 객체를 조회했을 때, 조회가 되지 않도록 @Where 처리를 해놓았으나, 실제론 해당 데이터가 여전히 조회됐다. // Book 엔티티 @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Where(clause = "state != 'DELETED'") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDEN..
문제 상황 스프링 + JPA에 MySQL을 연결해 사용하는 상황에서 “Group”이라는 엔티티를 정의한 후, yml 파일의 jpa.hibernate.ddl-auto 설정을 create로 하여 엔티티 정보에 따라 테이블을 jpa가 자동으로 생성하도록 처리해주었다. spring: jpa: hibernate: ddl-auto: create # 테이블 자동 생성 database-platform: org.hibernate.dialect.MySQL5InnoDBDialect database: mysql 하지만 서버를 켰을 때, SQL syntax error로 인해 “group” 테이블을 생성하는데 실패했다는 메시지를 뿜으며 테이블이 제대로 생성되지 않았다. org.hibernate.tool.schema.spi.Com..
Mock에 대한 이해 Spring에서는 DI 컨테이너에서 객체들 간의 의존성을 자동으로 관리해주기 때문에, 개발자는 소스 코드 상에서 의존성 주입에 대해 크게 신경쓰지 않고 개발할 수 있다. 하지만, 이렇게 작성한 소스 코드를 단위 테스트하는 과정에서 객체들 간 맺어진 의존성은 객체들이 서로 영향을 끼치도록 하여 테스트에서 각 객체들 간의 독립성을 해치고 테스트 코드의 신뢰성을 떨어트릴 수 있다. @RequiredArgsConstructor public class BookService { private final BookRepository bookRepository; public List getBooksUnderPrice(int price) { List allBooks = bookRepository.fi..
22년 2월을 마지막으로 무려 다섯 달만에 적는 글이 되겠다. 다섯 달 동안 쓰고 싶은게 없는 것도 아니었지만, 바쁘다는 핑계 + 하나를 쓰더라도 좀 제대로 쓰고 싶다는 욕심에 차일피일 미룬 끝에 어느새 시간이 이렇게나 빨리 흘렀다. 앞으론 자주까진 아니어도 종종 영양가 있는 글을 쓰겠다고 다짐은 하지만, 아마 다음 글은 22년 하반기 회고록일지도 모르겠다. 1. SSAFY 7기 합격 ❗️21년이 거의 끝나갈 때쯤 필기테스트 - 면접을 거쳐 최종합격하였고, 22년부터 본격적으로 활동을 했었다. 사실 합격하고 합격수기를 나름 적어보려고 했었는데, 이 또한 어영부영 미루다가 결국엔 쓰지 못했다. 내가 듣기론 내 다음 기수(8기)부터 필기 테스트가 살짝 바꼈다고 들었는데, 더욱이 내 수기가 다른 분들에게 큰 ..
문제 (링크) https://www.acmicpc.net/problem/1774 1774번: 우주신과의 교감 (1,1) (3,1) (2,3) (4,3) 이렇게 우주신들과 황선자씨의 좌표가 주어졌고 1번하고 4번이 연결되어 있다. 그렇다면 1번하고 2번을 잇는 통로를 만들고 3번하고 4번을 잇는 통로를 만들면 신들과 선자씨끼 www.acmicpc.net 나의 풀이 import sys input = sys.stdin.readline def get_dist(loc1, loc2): x1, y1, x2, y2 = loc1[0], loc1[1], loc2[0], loc2[1] return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 def find(parent, x): if x != p..