자바 Transactional 자바의 Trasncation은 더 이상 쪼갤 수 없는 실행이다. 하나의 실행단위이기에 여러 Thread에 실핼될수 있고 그 중에서는 동시에 실행되서는 안되는 critical한 Transaction이 존재할수 있다. 이를 위해 특정 transcation을 고립시켜서 실행시킬수 있게 해주는 Spring transcational annotation이 옵션에 대해 알아보자. 발생할수 있는 현상과 현상을 예방할수 있는 방법으로 구성하도록 하겠다. 트랜잭션 동시성과 관련해서 발생할수 있는 현상은 다음과 같은 3가지가 존재한다. 1. Dirty Read Dirty Read는 위의 그림을 보면 쉽게 이해가 가능합니다. 1) Transaction B는 특정 데이터베이스 컬럼값을 Update를 사용해 수정하고 아직 Com.. SOLID 원칙 객체지향을 설계하면서 가장 유명한 말인 SOLID 원칙에 대해 알아보자. 과연 SOLID 원칙이란 무엇일까? 객체지향 5대 원칙(SOLID) SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open Closed Priciple): 개방 폐쇄 원칙 LSP(Listov Substitution Priciple): 리스코프 치환 원칙 ISP(Interface Segregation Principle): 인터페이스 분리 원칙 DIP(Dependency Inversion Principle): 의존 역전 원칙 1. SRP(Single Responsibility Principle) - 단일 책임원칙 클린 코드의 마틴 로버트 C.마틴은 '어떤 클래스를 변경해야 하는 이유는 오직 .. 캡슐화란? OOP에는 상속, 다형성, 캡슐화등 다양한 기법들이 존재한다. 그중 귀에 못미 박히도록 듣는 캡슐화에 대해서 알아보자. 캡슐화 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉하는 걸 의미한다. 그렇다면 캡슐화는 왜 중요할까? 결론적으로 말하자면, 코드의 중복과 외부 변화에 대해 유연성과 확장성을 보장해주기 때문에 그렇다. 또한 객체에 직접 접근하는걸 방자함으로써, 예상치 못한 상황을 줄여준다. 하나의 예를 들어보자. public class GoodStore { private int goodAmount; } public void purchaseGood() { GoodStore goodStore = new GoodStore(); .. Interface가 왜 필요할까? 우리는 프로그래밍을 하면서 Interface를 선언하고, 그 Interface를 구현하면서 프로그래밍을 진행한다. 그렇다면 왜 interface가 필요할까? 인터페이스의 정의는 다음과 같다. 인터페이스 모든 기능을 추상화로 정의만 하고 구현은 하지 않은것을 의미한다. 모든 기능을 추상화하였다는 의미이다. 그렇다면 추상화란 왜 필요할까? 예를 들어서, Payment System을 개발한다고 생각해보자. Payment System에는 cashPay, cardPay가 존재한다. class CashPayment { public void cashPay() { //TODO Payment logic... } } class CardPayment { public void cardPay() { //TODO Payment .. 2. Adapter Pattern 설명하기전에 항상 생각해야 하는 주제가 있다고 생각한다. 우리는 왜 Adapter Pattern을 사용할까 ? 프로그래밍을 하며 시스템을 만들때는, 여러 다양한 라이브러리를 사용하거나 혹시 커스텀한 클래스나 인터페이스를 사용하고 싶은 경우가 있다. 상황을 한번 가정해보자. 나는 A라는 클래스를 만들고 있다. 근데 B라는 클래스가 가지고 있는 메소드들을 활용하거나 Overriding해서 클래스를 만들고 싶은 상황이다. 이럴 경우 할수 있는 방법은 1. 같은 상위 클래스를 가지는 경우, 다형성을 활용한다. 2. 그렇지 않을 경우 해당 객체를 상속한다. 하지만, 상속의 경우는 강한 결합을 낳게 된다. 강한 결합을 낳기에 is A관계가 아니면 신중해야 하며, 강한 결합을 하길 원치 않는다. 라는 판단이 설때, .. 1. Factory Pattern 개발을 진행하다보면 다음과 같이 일련의 코드를 만들어야 하는 경우가 생긴다. Pizza pizza; if (type.equals("cheeze")) pizza = new CheezePizza(); else if (type.equals("ham")) pizza = new HamPizza(); else if (type.equals("bacon")) pizza = new BaconPizza(); 이러한 코드가 존재한다는 것은 유연성이나 확장성에서 크나큰 문제를 야기할수 있다. 왜냐하면, 확장하거나 축소해야 할때, 코드를 다시 추가하거나 제거해야 함을 의미하기 때문이다. 인터페이스에 맞춰서 코딩을 하면 시스템에서 일어날 수 있는 여러 변화를 이겨낼 수 있다. 왜냐하면.. 다형성 덕분에 어떤 클래스든 특정 인터페.. 2. Class ArrayList public class MyarrayList implements MyList { private static final int DEFALUT_CAPACITY = 10; private static final Object[] EMPTY_ARRAY = {}; private int size = 0; Object[] array; public arrayList() { this.array = EMPTY_ARRAY; this.size = 0; } public arrayList(int capacity) { this.array = new Object[capacity]; this.size = 0; } public void addLast(E value) { if (size == array.length) { resize(); }.. 1. interface List public interface MyList extends MyCollection { E get(int index); E set(int index, E element); void add(int index, E element); E remove(int index); int indexOf(Object o); int lastIndexOf(Object o); List subList(int fromIndex, int toIndex); } 메소드 설명 1. get(int index) : 배열속에 특정 인덱스 값을 가져온다. 2. set(int index, E element) : 배열속에 특정 인덱스에 값을 수정한다. 3. add(int index, E element) : 배열속에 특정 인덱스에 값을 삽입한다. 4. .. 이전 1 ··· 10 11 12 13 14 15 16 ··· 32 다음