전체 글
[JDBC] PreparedStatement와 Statement의 차이
PreparedStatement와 Statement의 차이는 뭘까? 우선 둘의 가장 큰 차이점은 캐시 사용 여부이다. Statement를 사용하게 되면 매 쿼리 수행 시 쿼리 문장을 분석한다. -> 쿼리를 컴파일 한다. -> 쿼리를 실행한다.의 과정을 거치게 된다. 반면 PreparedStatement를 사용하게 되면 첫 실행 시에만 세 단계를 거치고, 다음 번 실행 시부터는 캐시에 담아놓고 재사용한다. 따라서 동일한 쿼리를 반복 수행한다면 PreparedStatement가 성능 및 부하 측면에서 낫다. 위 내용은 [Comparison] PreparedStatement 와 Statement에서 발췌한 내용이므로 더 자세한 내용은 해당 링크에서 확인할 수 있습니다아 :)
[JDBC] Try-with-resources
JDBC API를 직접 사용하는 경우, Connection, PreparedStatement, ResultSet을 어떻게 하면 잘 닫을 수 있을까? 이 때, 사용할 수 있는 방법이 Try-with-resources이다. Try-with-resources try문 내부에 우리가 사용할 객체를 명시해준다. 이렇게 하면, try-catch 구문을 벗어날 때 해당 객체의 close() 메서드를 호출한다. 따라서 따로 close();를 일일히 해주지 않아도 된다 :) public void delete(String name) throws SQLException { String query = "DELETE FROM History WHERE Name = ?"; try (Connection connection = Dri..
[M1 맥] MySQL 및 MySQLWorkbench 설치하기
우선 MySQL은 brew 를 이용해 설치했다. 참고한 블로그는 twinparadox.tistory.com/619 이다. 해당 블로그에서 필요한 내용만 발췌하자면, 다음과 같은 순서로 간단히 mysql을 설치할 수 있다. brew install cask brew update brew install mysql@5.7 다음으로는 MySQLWorkbench이다. 원래는 Sequel ACE를 주로 쓰고 있어서 그걸 사용하려고 했는데, 여쭤보니 MySQLWorkbench가 실행 계획이 잘 나타나기에 그 부분에서 용이하여 사용하신다고 한다. 그래서 설치를 하게 되었음! 우선은 8.0.23 버전은 M1 에서 열리지 않는다는 말이 워낙 많길래, 버전을 8.0.20으로 다운그레이드하여 진행하였다. MySQLWorkben..
[UML] UML 기본 정리
Usecase사용자가 어떤 목적을 달성하기 위해 시스템과 주고 받는 전형적인 교류를 Usecase라 한다. usecase는 규모 면에서 다양하게 변활 수 있다. 중요한 것은 usecase는 사용자가 이해할 수 있고 사용자에게 어떤 가치를 주는 기능을 의미한다. 우리는 구축하고 있는 시스템에서 사용될 수 있는 잠재적 usecase들을 알아내는 것이 중요하다. 하지만 usecase가 자세할 필요는 없다. (어쩌면 유즈케이스는 요구사항으로 볼 수 있을 듯 하다.) Domain modelUML Distilled 도서에서 발췌한 예시를 통해 도메인에 대해 알아보자. 고객들은 여러 사이트에 흩어져 있고 우리는 이들 사이트에 여러 가지 서비스를 제공한다. 현재 상태로는 고객은 모든 서비스에 대한 청구서를 주어진 사이..
객체지향 설계에서 주로 사용할 수 있는 디자인 패턴 정리
전략 패턴 (Strategy Pattern) 서로 다른 정책이 한 코드에 섞여있는 경우 (한 메서드에) 전략 패턴을 적용할 수 있다. 전략 패턴은 특정 콘텍스트에서 알고리즘(전략)을 별도로 분리하는 설계 방법이다. 여기서 콘텍스트와 전략에 대해서 알아보자. 먼저, 콘텍스트는 핵심 기능 자체의 책임을 갖고 있는 부분을 의미한다. 예를 들어 계산 정책에 있어 첫 손님에게는 50% 할인, 남은 과일을 가져가는 손님에게는 30% 할인이 들어간다고 할 때, 여기서 핵심적인 부분은 어쨌든 계산이다. 어떤 할인 정책을 사용하는냐는 방법의 문제이고, 우리는 그 방법을 적용해 계산을 해야한다. 따라서 위 예시에서 콘텍스트는 계산 기능이 될 것이다. 다음으로 전략이란 공통된 부분을 추상화하고 있는 부분이다. 위 예시에서 ..
Java의 Stack도 방어적 복사(defensive copy)를 해야할까?
우선 우리는 불변 객체를 사용하는 것을 권장한다. 불변 객체란 객체 생성 이후 내부의 상태가 변하지 않는 객체를 말한다. 만약, 객체의 내부 상태를 제공하는 메소드를 지원하는 경우 방어적 복사를 통해 제공한다. 그렇다면, 방어적 복사란 무엇일까? 방어적 복사란? 내부의 상태를 제공하는 메소드를 지원하는 경우 (ex. getter) 외부와 내부에서 주소값을 공유하는 인스턴스의 관계를 끊어주기 위해 사용된다. 우선, 아래의 예시 코드를 보자. public class TestClass{ private final List strings; public TestClass() { strings = new ArrayList(); } public List getStringsWithoutDefensiveCopy() { r..
왜 상속보다는 조합을 사용해야할까?
개발자가 반드시 정복해야 할 객체지향과 디자인 패턴에서 발췌한 글이 포함되어 있습니다. 요즘 우아한 테크코스를 진행하며 가장 자주 듣는 문장 중 하나인 것 같다. 상속보다 조합(Composition)! 왜 우리는 상속보다 조합을 이용해야할까? 상속과 재사용 상속을 사용하면 쉽게 다른 클래스의 기능을 재사용하면서 추가 기능을 확장할 수 있다. 그러므로 기능의 재사용이라는 측면에서 상속은 아주 매력적인 솔루션이다. 하지만 상속은 변경의 유연함이라는 측면에서 단점을 갖는다. 상속을 통한 재사용의 단점 - 상위 클래스 변경이 어렵다. 상위 클래스에서 무언가 변경이 발생해야 할 때, 그 전파는 하위 클래스까지 이어지게 된다. 특히 계층도가 커질수록 상위 클래스의 변경이 어려워진다. 상속 계층을 따라 상위 클래스의..
객체지향적 설계란 무엇일까?
한 객체에 기능이 많아지면 절차 지향적인 구조를 갖게 된다. (절차 지향적인 구조를 갖게 되면 기능과 관련된 데이터를 공유하기 때문에 유연하지 못한 구조를 갖게 된다.) 따라서 객체가 갖는 책임의 크기는 작아질수록 유연함을 얻을 수 있다. (관련 원칙 : SRP) 의존이 순환해서 발생할 경우 꼬리에 꼬리를 문 것 처럼 영향이 전파된다. (변경은 의존 관계를 따라 전이된다.) 내가 변경되면 나에게 의존하고 있는 코드에 영향을 준다. 나의 요구가 변경되면 내가 의존하고 있는 타입에 영향을 준다. 그러므로! 캡슐화가 필요하다. 기능 구현을 캡슐화하면 내부 구현이 변경되더라도, 기능을 사용하는 곳의 영향을 최소화할 수 있다. 캡슐화를 위한 두 개의 규칙 Tell, Don’t Ask 데이터를 물어보지 않고, 기능..
절차지향은 왜 지양해야 할까?
개발자가 반드시 정복해야 할 객체지향과 디자인 패턴에서 발췌한 글이 포함되어 있습니다. 우선 책의 1장을 읽으며 기록해뒀던 것들을 스스로 남겨두기 위해 몇 줄 적고 본격 절차지향을 지양해야하는 이유에 대해 작성하겠다.본격 구현 전, 설계를 통해 비슷하게 동작하는 것들을 구분하자서로 다른 이유로 변경되는 코드가 한 메서드에 섞여있으면 향후 유지 보수하기 어렵다. 메서드 내부의 코드들이 모두 같은 목적을 바라보고 있는지 확인해보자소프트웨어는 사용자의 요구 사항을 만족시킴과 동시에, 변화할 수 있어야한다. (요구사항은 언제든 변화할 수 있다.)절차지향을 지양해야하는 이유절차지향과 객체지향 중, 객체지향을 따라야 한다는 말은 많이 들어봤을 것이다. 그런데 도대체 왜? 절차지향보다 객체지향을 지향해야할까라는 의문..