목록전체 글 (179)
코딩마을방범대
Git을 사용하다보면 여러 브랜치 별로 관리하는 경우가 생긴다. 이럴 경우 공통 수정 사항이 생기면 브랜치 별로 끼워맞추는게 여간 불편한게 아니다. 여태 찾아볼 생각 없이 수동으로 하나하나 체크하면서 수정했는데, 역시 찾아보니 Git의 기본 기능으로 있었다. Cherry-Pick 이라는 기능을 통해 특정 커밋만 가져올 수 있다. 특정 커밋 가져오기 1. 타겟 브랜치로 체크아웃 GithubDesktop 프로그램을 통해 브랜치를 변경 Intellij의 git 탭에서 해당 브랜치의 커밋 클릭 후 Checkout 클릭 아래 명령어 이용 git checkout 브랜치명 2. 커밋 히스토리 확인 Intellij에서 git 탭의 해당 브랜치 클릭 아래 명령어 사용 git log 브랜치명 3. 커밋 선택 후 Cherr..
@Configuration, XML 기반으로도 트랜잭션을 구성할 수 있지만 이번엔 어노테이션을 이용한 방법으로 알아볼 것이다. 어노테이션 방식은 선언적 트랜잭션이라고 불리고, 선언 시 트랜잭션 기능이 적용된 프록시 객체가 생성된다. 프록시 객체란 앞서 포스팅했던 '프록시(Proxy)란' 과 비슷한 개념을 갖고 있다. 객체와 DB 사이의 중간 다리 역할을 해주는 또 다른 객체라고 볼 수 있다. 만약 사용자가 객체의 get을 이용해 데이터를 조회했을 때, 프록시 객체의 Entity Target 값이 비어있다면 DB를 조회해 Entity 생성 후 프록시 객체의 타겟 값으로 저장한다. 이 프록시 객체의 타겟값을 이용해 데이터 조회에 대한 응답을 리턴한다. (JPA에서 지연로딩을 적용하면 프록시 객체가 생성된다...
인코딩(encoding) 정보의 형태나 형식을 데이터 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태로 변환하는 처리 혹은 그 처리 방식을 말한다. 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다. 미리 정해진 기준을 바탕으로 입력과 해독이 처리되어야 하는데, 이를 문자열 세트 또는 문자셋이라고 한다. 초기 문자열 세트는 아스키나 EBCDIC이 표준이었으나, 세계 곳곳에 인터넷이 보급되며 표현해야 할 문자가 증가하면서 이러한 문자셋을 표준화하기 위해 많은 대체 방식이 개발되었다. ( 현재 보편화된 유니코드가 대표적 ) ASCII는 더 이상 문자가 추가될 수 없지만, 유니코드는 문자가 계속 추가되는 중이다. ( 유니코드에서 한국어 발음을 나타날 ..
순차 & 병렬 & 병행 처리의 차이점 순차 처리 ( Sequential ) 여러 작업을 순서대로 하나씩 처리 병렬 처리 ( Parallel ) 여러 작업을 동시에 처리 병행 처리 ( Concurrent ) 한 개의 업무를 어떠한 순서로 처리하든 상관없는 여러 개의 작업으로 분할하여 처리 ※ 멀티쓰레드 프로그램의 경우 병행 처리를 의미함 만약 CPU가 한 개라면 순차적으로, 여러개라면 병렬적으로 실행한다. CPU가 하나라면 복수의 쓰레드가 작동하고 있다 하더라도 여러 개의 작업으로 분할하여 순차적으로 실행한다. 즉, 동일한 시간 대에 실행되는 쓰레드는 오직 하나이지만, 여러 개의 쓰레드가 무작위로 번갈아가면서 실행됨으로써 결과적으로 동시에 처리되는 것처럼 보인다. ex ) 쓰레드 1 실행 -> 쓰레드 2 ..
Hashtable Hashtable 클래스를 살펴보면 메소드 전체에 synchronized 키워드가 적용되어 있는 것을 확인할 수 있다. 따라서 멀티쓰레드 환경에 적합하며, 쓰레드 세이프 하다는 특징이 있다. 하지만, 동시 작업을 실행하려할 경우 Lock을 하나씩 가지고 있기 때문에 동시 작업 시 병목 현상이 발생할 수 밖에 없다. ( 메소드에 접근하게 되면 다른 쓰레드는 Lock을 얻을 때까지 기다림 ) ※ Collection Framework가 나오기 이전부터 존재하는 클래스이기 때문에 최근에는 잘 사용하지 않는 클래스라고 한다. public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable { publ..
List List list = new ArrayList(); list.add("1"); list.add("2"); 초기화 시에 선언이 불가능한 경우라면 위의 방법밖에 없겠지만, 초기화 시 미리 데이터를 넣어놓는 간단한 방법도 있다. 1. Arrays.asList 고정된 크기이며, 변환 가능한 배열로 저장된다. 따라서 set을 통해 데이터를 갱신할 순 있지만 요소를 추가, 삭제 하는 것은 오류가 발생한다. ( 추가, 갱신, 삭제 모두 불가능 ) List animals = Arrays.asList("강아지", "고양이", "카피바라"); animals.set(0, "비둘기"); animals.add("푸바오"); // UnsupportedOperationException 발생! animals.remove(0..
String 문자열을 쌓을 때 String을 사용할지, StringBuilder or StringBuffer를 사용할지는 아래 포스트를 참고해서 결정하자! [Java] String, StringBuffer, StringBuilder의 차이점 List to String List를 String으로 변환하는 방법을 먼저 알아보면 내가 알기론 5가지가 존재한다! 1. forEach (확장 for문) StringBuilder str1 = new StringBuilder(); for(String str: list){ str1.append(str); } 2. for문 StringBuilder str2 = new StringBuilder(); for( int i = 0; i < list.size(); i++ ){ st..
여태 문자열을 이어붙일 때 StringBuilder 같은 건 선언하기 귀찮기도 하고 그렇게 친숙하진 않아서 String + 로 추가해왔는데 StringBuilder와 StringBuffer에 대해 알아봐야할 필요성을 느꼈다. String 불변(immutable) 자료형 ( 인스턴스 생성 시 생성자의 인자 value는 상수(final)로 선언되어있다. ) String 객체를 불변하게 설계한 이유는 캐싱, 보안, 동기화, 성능측면 이점을 얻기 위해서이다. 1. 캐싱 : String을 불변하게 함으로써 String pool에 각 리터럴 문자열의 하나만 저장하며 다시 사용하거나 캐싱에 이용가능하며 이로 인해 힙 공간을 절약할 수 있다는 장점이 있다. 2. 보안 : 예를 들어 데이터베이스 사용자 이름, 암호는 데..