본문 바로가기

IT54

mybatis $ # 차이 select user_nm, user_id from user where user_id = #{user_id} and user_pwd = #{user_pwd} $ (Statement) SELECT ID FROM test WHERE num= ${num} Oracle로 넘어온 쿼리 SELECT ID FROM test WHERE num = 77 실제 수행 쿼리 SELECT ID FROM test WHERE num = 77 num값이 달라지면 다른쿼리로 인식하기때문에 새로 파싱등의작업으로 속도 저하 '$'와 같은 경우 자주 바뀌지 않거나 사용자의 입력을 받는 경우가 아닐 때 사용하면 좋습니다. 예를 들어 컬럼명. 만약 사용자의 입력을 받는 경우 SQL Injection 보안 위험이 발생합니다 # (prepared.. 2022. 1. 24.
DB 튜닝을 알아보자 실행계획이란? 사용자가 SQL을 실행하여 데이터를 추출하려고할 때, 옵티마이저가 수립하는 작업절차(SQL의 성능에 굉장히 중요) SQL해석 → 실행계획수립 → 실행 [왼쪽 아래가 제일 먼저실행] 실행계획 확인방법 EXPLAIN PLAN 실행계획을 떠서 저장해놓고 확인하는 방식 SQL에 대한 실행계획만을 확인할 수 있음 명령을 사용할때 데이터를 실제로 처리하지않음 (DB에 부하를 주지않기때문에 유용함) 다만 SQL문이 여러개면 SQL을 바꿔가면서 작성해야하는 불편함 존재 실제로 확인하기위해서는 다시 SELECT를 해야하는 불편함 존재 실제로 DB실행이 된것도 아니기때문에 소요시간도 체크 불가능 SET AUTOTRACE EXPLAIN PLAN 명령과는 달리 한번의 명령으로, 여러개의 SQL에 대한 실행계획을.. 2022. 1. 24.
Java8 람다(Lambda)를 이용한 프로그래밍 함수형 인터페이스람다를 이용한 프로그래밍 람다를 받는다(함수형인터페이스를 찾던가 만들던가)람다를 호출해야하는지 검사필요할때 람다를 호출모든 람다의 핵심은 지연실행이다. 코드를 나중에 실행할 이유는 다음과 같다.별도의 스레드에서 코드실행코드를 여러번 실행알고리즘에서 코드를 적절한 시점에서 실행(정렬 비교연산 등)어떤일이 발생했을 때 코드 실행(이벤트 등..)필요할때만 코드 실행각 픽셀에 Color → Color 함수를 적용하여 이미지를 변환한다고 가정.public static Image transform(Image image, UnaryOperator f){ // 고정된 값만큼 모든 픽셀의 밝기를 올리는 메서드// ..... f.apply(image.getColor);}Image brightenedImag.. 2022. 1. 23.
Java8 스트림(Stream)연산을 사용해보자 Stream(스트림)연산컬렉션을 처리할때 보통은 요소들을 첨부터 끝까지 순회하면서 각 요소를 대상으로 작업한다. 하지만, Java8 부터는 스트림연산을 통해 반복하지 않아도 된다.List word;int count = 0;for(String w : words){ // 일반 방식 if(w.length() > 12) { count++; }}long count = words.stream().filter(w -> w.length() > 12).count(); // 스트림스트림은 데이터를 변환하고 추출할수있어서 겉으로는 컬렉션과 유사해보이지만 큰 차이점이 있다.스트림은 요소들을 보관하지않는다. 요소들은 하부의 컬렉션에 보관되거나 필요할때 생성된다.스트림 연산은 원본을 변경하지않는다. 대신 결과를 담은 새로운 스.. 2022. 1. 23.
Java8 람다(Lambda)를 사용해보자 Lambda 메서드를 간단한 식으로 표현하는 방법 다른언어들은 자바와 다르게 함수자체를 파라미터로 보낼 수 있지만, 자바는 객체지향언어이므로 함수자체를 보낼수없어서 그 함수를 포함한 객체를 만들고 그 객체를 보내야 하는 불편함이 있었다. class ABC implements Compatrator{ public int compare(String first, String second){ // {return a + b;}; (a, b) -> a+b; 한줄로 처리되는 바디는 {}로 감쌀필요가 없다. 여러줄로 처리되어야하는 바디는 {}로 감싼다. {}를 사용할때는 return문을 명시적으로 써줘야한다. 기본적으로 람다파라미터에는 타입을 명시해주는게 맞지만, 유추가 가능할경우에는 타입명을 생략가능하다. 타입유추가 .. 2022. 1. 23.
Java8 옵셔널(Optional<T>)객체 올바르게 사용하기 Optional Optional 객체는 T타입 객체 또는 객체가 없는 경우의 래퍼다. T타입일수도있고 null일수도있을때 쓰는 표현이다. optional은 객체 또는 null을 가리키는 T타입 레퍼런스보다 안전한 대안으로 만들어졌다. 하지만 올바르게 사용할 경우에만 안전하다. (Optional을 제대로 사용하려면, Optional을 최대 1개의 원소를 가지고 있는 특별한 Stream이라고 생각하면 편하다.) get메서드는 감싸고있는 요소가 존재할때만 요소를 얻고, 그렇지않으면 NoSuchElementException을 던진다. Optional val = ...; val.get().someMethod(); // v.처리); val.ifPresent(v -> list.add(v)); // 리스트에 해당값을 .. 2022. 1. 23.