전체 글

취뽀완료
Java

collect(Collectors.toList()) vs Stream.toList()

평소 스트림을 리스트로 변환할 때 단순히 Stream.toList()를 활용해왔다. 하지만 어제 프로그래머스에서 코테 문제를 풀다가 Stream.toList()를 지원하지 않고 Collectors.toList()만 지원되는 것을 보고, 이 둘의 차이점을 조금 더 명확히 알 필요가 생겨 정리하게 되었습니다. (우선 결론부터 말하자면.. stream의 toList는 자바 16이상 버전부터 지원하기에, 프로그래머스는 해당 버전이 아니어서 지원을 안한걸로) 우선 Collectors.toList()의 자바 공식 문서 설명을 보면 다음과 같습니다. Returns a Collector that accumulates the input elements into a new List. There are no guarante..

스프링 강의 필기

db 2편 - 스프링 트랜잭션 전파

해당 코드를 한 번 봐보자. @Test void double_commit() { log.info("트랜잭션1 시작"); TransactionStatus tx1 = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜잭션1 커밋"); txManager.commit(tx1); log.info("트랜잭션2 시작"); TransactionStatus tx2 = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜잭션2 커밋"); txManager.commit(tx2); } 우선 트랜잭션 1과 트랜잭션 2는 분명히 다른 트랜잭션이다. 트랜잭션이 각각 수행되면..

책 정리/도메인 주도 개발 시작하기

Chapter 1. 도메인 모델 시작하기

1. 도메인이란? 온라인 서점을 우리가 구현한다 생각해보자. 이 때 온라인 서점은 소프트웨어로 해결하고자 하는 문제 영역 -> 즉, 도메인에 해당한다. 한 도메인은 여러 개의 하위 도메인으로 나눌 수 있다. 온라인 서점을 예로 들면, 주문, 회원, 혜택, 리뷰, 정산, 배송 등이 있을 것이다. 2. 도메인 전문가와 개발자 간 지식 공유 요구사항을 제대로 이해하지 않은 채 개발을 하다보면 요구하지 않은 엉뚱한 기능들을 만들 수 있다. 이러한 잘못 개발된 코드를 수정하려면 많은 자원이 투입된다. 그렇다면 요구사항을 올바르게 이해하려면 어떻게 해야할까? 바로 개발자와 전문가가 직접 대화하는 것이다. 개발자와 전문가 사이에 내용을 전달하는 전달자가 많을수록 정보과 왜곡되고 손실이 발생하게 된다. tip) 도메인..

스프링 강의 필기

DB 2편 - 스프링 트랜잭션 이해

이번 포스팅에서는, 스프링 트랜잭션이 제공하는 다양한 기능들에 대해 정리해보자. (이전 DB 1편 포스팅을 참고하자) 트랜잭션 적용 확인 트랜잭션이 적용되고 있는지 테스트코드로 한번 확인해보자. @Slf4j @SpringBootTest public class TxBasicTest { @Autowired BasicService basicService; @TestConfiguration static class TxApplyBasicConfig { @Bean BasicService basicService() { return new BasicService(); } } @Test void proxyCheck() { log.info("aop class = {}", basicService.getClass()); as..

스프링 정리

Path Variable vs Query Parameter

우리가 자주 코드를 작성하다보면, client로부터 인자를 path Variable로 받을지, RequestParam으로 받을지, 아니면 RequestBody로 받을지 고민된다. GetMapping에서는 RequestBody를 지원하지 않기에, 자연스레 GetMapping을 할 때는 PathVariable vs RequestParam으로 귀결되게 된다. 이런 상황일 때, 나름의 기준이 있으면 좋을 것 같아 정리해보려 한다. 1. Query Parameter /users?id=123 # 아이디가 123인 사용자를 가져온다. @GetMapping("/user") public String getUser(@RequestParam String id, @RequestParam(name="password" Strin..

대외활동/프로그래머스 데브코스 백엔드 5기

백엔드 데브코스 2개월차 회고 - 봄(스프링)

어느덧 데브코스를 시작한지 2달이 되어간다. 2개월차에는 어떤 활동들을 했는지 기록 및 느낀 점들에 대해 남겨보려 한다. 어떤 활동을 했는가 이번 한 달은 스프링이 주된 공부였다. Spring Boot에 대한 전반적인 공부를 약 3주간 진행하고, 1주일 정도 개인 프로젝트를 진행했다. 사실 스프링의 경우 당장 김영한 개발자님의 스프링 커리큘럼만 봐도 알겠지만 엄청 방대한 공부량이 필요하다. 그랬기에 처음 스프링을 3주 정도만에 진도를 다 나갈 수 있을까? 라는 의문이 든 것은 사실이다. 강의를 3주간 다 듣고 느낀 점은, 스프링 개발을 하는 데 핵심적인 내용들은 강의에 다 담았다고 생각한다. 내가 스프링을 엄청 잘 안다! 이건 아니지만.. 나의 경우는 작년에 김영한 개발자님의 커리큘럼은 한 번 다 들었던..

스프링 강의 필기

DB 강의 1편 - 트랜잭션 문제 해결(2)

1편에 이어, 다시 한 번 코드를 봐보자. TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { bizLogic(fromId, toId, money); transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); throw new IllegalStateException(e); } 다른 서비스에서 트랜잭션을 시작하려면, 지금 코드처럼 트랜잭션을 시작하고, 성공하면 커밋하고 실패하면 롤백하는 코드를 추가로 작성해줘야 한다. 난 단순히 서비스 로직에만 집중하고 싶은데....

스프링 강의 필기

DB 강의 1편 - 트랜잭션 문제 해결(1)

@RequiredArgsConstructor public class MemberServiceV2 { private final DataSource dataSource; private final MemberRepository memberRepository; public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSource.getConnection(); try { con.setAutoCommit(false); // 트랜잭션 시작 bizLogic(con, fromId, toId, money); // 비즈니스 로직 con.commit(); // 성공시 커밋 } catch ..

void_melody
성수의 프로그래밍 극복 기록