전체 글
[Spring] DB ConnectionPool이란?
DB Connection DB를 사용하기 위해 DB와 애플리케이션 간 통신을 할 수 있는 수단. DB 드라이버와 DB 연결정보를 담은 URL이 필요하다. DB 커넥션풀 DB 커넥션 객체를 여러 개 생성하여 풀(Pool)에 담아놓고 필요할 때 꺼내쓰는 방식. 즉, 자주 쓰는 객체를 미리 만들고, 사용한 다음 필요할 때마다 가져간 다음에 반납하는 방식(=Pooling)을 의미한다. 간단히 정리하자면 다음과 같다. 여러 개의 DB Connection을 하나의 Pool에 모아놓고 관리 DB 커넥션 객체를 여러 개 생성한 뒤 Pool에 담아놓고 필요할 때 불러와서 사용 만약, 빌려줄 수 있는 Connection이 없다면 Connection 객체가 반환할 때 까지 클라이언트는 대기 상태로 전환 사용이 끝난 커넥션 ..
[우테코] 레벨 2 지하철 노선도 미션 회고
지하철 노선도 미션은... 여러모로 대박이었다. 먼저, 아리와 페어 프로그래밍을 하였다는 점이다. 사실 이번 미션은 페어 초반부터 코로나 이슈가 터져 갑자기 집으로 돌려보내질 위기에 있었는데 (통학시간은 왕복 세시간이다.) 아리 덕분에 페어 프로그래밍을 얼추 끝내고 집에 도착할 수 있었다. 테스트 코드가 통과하자 카페에서 박수쳤던게 아직도 기억난다. 레벨 로그 말하기에서 시작한 인연이 이렇게 잘 이어지고 좋은 동료와 친해질 수 있어서 감사한 시간이었다. 두 번째는 스프링에 또 부딪혔다는 점이다... 레벨 1에서 분명 TDD와 객체지향 프로그래밍에 익숙해졌다고 생각했는데 스프링과 웹을 진행하다 보니 다시 돌아온거같은 기분이다. 내가 객체지향적인 설계를 잘 못하는 건가? 내가 조금 더 깊게 생각을 했어야 했..
[TDD] 테스트 코드 작성 순서와 종류
레벨 2가 되고 Spring을 사용하다 보니 TDD에 대한 부분이 다소 무너지는 것 같아서 테스트 주도 개발 시작하기 (최범균 저)의 내용을 간단하게 정리하여 이야기해보고자 한다. 테스트 코드 작성 순서 쉬운 경우에서 어려운 경우로 진행 예외적인 경우에서 정상인 경우로 진행 초반에 복잡한 테스트부터 시작하면 안 되는 이유 초반부터 다양한 조합을 검사해야 하는 코드를 만들게 되면, 해당 테스트를 통과시키기 위한 코드가 많아진다. 한 번에 완벽한 코드를 짤 수는 없기 때문에 작성하기 쉬운 코드를 작성하는 것이 개발 속도에 많은 도움이 된다고 한다. 한 번에 구현하는 시간이 짧아지면 디버깅할 때 유리하고, 원인을 찾기도 더 빠르다. 예외상황을 먼저 테스트해야 되는 이유 예외상황은 복잡한 if 블록을 동반할 때..
도메인이란 무엇인가?
개발을 진행함에 있어서 '도메인' 이라는 개념을 처음 들어본 사람은 없을 것이라고 생각한다. 그러나, '도메인이 뭐라고 생각하세요?' 라고 물어보면 막상 대답하기 어려운 것이, 이렇게 적당히 알고 있기 때문에 넘어가는 개념들이라고 생각한다. (일단, 나는 그랬다.) 이프와 이야기하다가 해당 개념에 대한 나의 생각이 부족하다고 생각해서 도메인에 대한 정리를 해보려고 한다. 도메인이란? 먼저, 사전적 정의를 얘기해보자 A domain is a field of study that defines a set of common requirements, terminology, and functionality for any software program constructed to solve a problem in th..
[Spring] 의존 자동 주입, @AutoWired
@Autowired 어노테이션을 이용한 의존 자동 주입 대체로 스프링에서 자동주입이라고 말하면 @Autowired 어노테이션이 붙어있는 경우를 말한다. @Autowired 를 해당 필드나 메서드에 붙이게 되면 스프링은 타입이 일치하는 빈 객체를 찾아서 주입하게 된다. 만약 생성자 주입을 사용한다면, 생성자가 하나일 경우 @AutoWired 를 생략해도 자동 주입된다. public class MemberInfoPrinter { private MemberDao memDao; private MemberPrinter printer; public void printMemberInfo(String email) { Member member = memDao.selectByEmail(email); if (member =..
[Spring] @Component vs @Bean
저번 포스팅 ([Spring] Java Bean vs Spring Bean) 에 이어서 빈과 관련된 두번째 포스팅을 진행한다. 스프링 MVC에서는 @Controller, @Service, @Repository 등으로 빈으로 등록할 수 있으며, configuration 관련 객체들은 @Bean과 @Component 으로 스프링 컨테이너에 객체를 빈으로 등록할 수 있다. 그럼 @Bean 과 @Component의 차이는 무엇일까? 두 어노테이션은 혼용해도 될까? 정답은 No다. @Bean과 @Component는 각자 선언할 수 있는 타입이 정해져있어 해당 용도외에는 컴파일 에러를 발생시킨다. 각각의 어노테이션에 대해서 알아보도록 하자. @Component 개발자가 직접 컨트롤이 가능한 Class들의 경우에사용..
[우테코] 레벨 2 체스미션 회고
우테코 레벨 2가 시작되고 벌써 첫 번째 미션이 마무리되었다. 체스 2단계 PR 링크 스프링을 해보긴 했으나, 이걸 했다고 말할 수 있을지 부끄러울 정도로 깊이가 얕았다는 것을 새삼 깨닫는 요즘이다. 집에 돌아와서 늘 한 시간 정도는 순수하게 스프링에 대한 내용만 공부하는 시간을 가지려고 노력하는데, 그것도 쉽지는 않다. 분명히 영한님께 배웠는데... 그게 다 어디간걸까... 왜 이런 어노테이션을 쓰지? 왜 Spring에서는 Service, Controller, Dao(Repository)를 나누지? 왜 에러코드가 400이어야 할까? 와 같이 질리도록 '왜?' 라는 질문을 했던 것도 이번 미션이 가장 심했던 것 같다. 나름 성실해지려고 노력은 했는데, 그만큼의 성과가 나오지 않는 것 같아서 (아직도 스프..
[Spring] Controller에서 데이터 받기
대체로 Spring으로 애플리케이션을 구성한다면, Controller에서 값을 받아서 비즈니스 로직을 처리하도록 넘기게 된다. 이때, 이러한 Method Parameter를 어떻게 받는지에 대해서 이야기해보고자 한다. 어찌보면 간단한 개념을 왜 정리하지? 싶을 수도 있으나, 공식 문서를 보게되면 굉장히 많은 Method Argument를 제공하고 있다는 것을 볼 수 있다. 그렇기에, 일단 지금 쓰는 것을 제대로 소화하고, 그 이유를 이해한 뒤에 추가적으로 다른 개념들을 이해하면 더 좋을 것 같아서 정리해본다. @RequestParam @Controller @RequestMapping("/pets") public class EditPetForm { // ... @GetMapping public String..
[Spring] Java Bean vs Spring Bean
스프링으로 개발을 진행하다보면, Bean이라는 개념을 정말 자주 만나게 된다. 무슨 느낌인지 대충은 알겠는데... 그래서 대체 Bean은 어떻게 만들어지는 것이고, 무슨 개념일까? 라고 물으면 막상 대답하기는 쉽지 않다. 그래서 일단 Bean이라는 것이 무엇인지부터 알아보면서 Bean에 대해서 하나씩 정리해보고자 한다. Java Bean Bean은 스프링에서만 나오는 개념 아니야? 라고 물어볼 수 있으나, 자바에도 빈이라는 개념은 존재한다. 위키피디아 링크 Java Bean은 데이터 표현을 목적으로 하는 특정 형태의 클래스라고 이해하면 된다. DTO나 VO와도 유사한 점이 있어 보인다. 개발 툴이나 응용프로그램에서 사용하고자 하는 개념으로 출발했다고 하나, 현재는 그 의미로는 거의 사용하지 않는 것으로 ..
[Spring] @ExceptionHandler 와 @ControllerAdvice
예외처리 프로그래밍에서 예외처리는 매우 중요하다. 사실 우테코에 들어오기 전에는 예외처리와 관련된 코드를 매우 세세하게 짜는 편은 아니었다. 그냥 돌아가면 되는 거지! 정도의 코드였다. 다만, 상세하고 다양한 예외를 갖출 수 있게 된다면 더 안정적인 프로그램이 만들어질 수 있다. 그렇지만 try-catch나 if문으로 예외를 잡거나 상위메서드로 예외처리를 위임하는 등의 작업을 진행하더라도 코드는 쉽게 복잡해질 수 있고, 이는 비즈니스 로직보다 예외처리를 위한 코드에 더 힘쓰게 되는 결과를 초래한다. 나 역시 해당 부분에 있어서 잘 모르는 부분이 존재했고, 또한 기존 Spark 구현 코드를 Spring으로 이식하는 과정에서 예외처리와 관련된 문제들을 해결하기 위해 @ExceptionHandler와 @Con..