STUDY
-
@TransactionalSTUDY/백엔드 2021. 5. 7. 11:53
트랜잭션이란? 데이터베이스의 상태를 변경시키는 작업 또는 한번에 수행되어야하는 연산들을 말한다. 트랜잭션 작업이 끝나면 commit 또는 rollback 되어야한다. 트랜잭션 성질 원자성(Atomicity) : 한 트랜잭션 내에서 실행한 작업들은 하나의 단위로 처리한다. 즉 모두 성공 또는 모두 실패이다. 일관성(Consistency) : 트랜잭션은 일관성 있는 데이터베이스 상태를 유지한다. 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야한다. 지속성(Durability) : 트랜잭션이 성공적으로 처리되면 결과가 항상 저장되어야 한다. @Transactional 스프링에서는 @Transactional 어노테이션을 선언하는 방법으로 트랜잭션 처리를 지원하는데,..
-
람다 표현식STUDY/백엔드 2021. 5. 6. 17:19
람다 표현식(lamda expression)이란? 메소드를 하나의 식으로 표현한 것을 말한다. 메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다. 람다 표현식은 메소드의 매개변수로 전달될 수도 있고, 메소드의 결과값으로 반환될 수도 있다. 메소드 int max(int x, int y) { return x > y ? x : y; } 람다 표현식 (x, y) -> x > y ? x : y; 장점 1. 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있다. 2. 지연연산 수행 - 람다는 지연연상을 수행함으로써 불필요한 연산을 최소화 할 수 있다. 3. 병렬처리 가능 - 멀티쓰레디를 활용하여 병렬처리를 사용 ..
-
Array.forEach()STUDY/프론트엔드 2021. 5. 6. 15:33
개발을 하면서 아래와 같이 객체의 invalid를 check할 때 Array.forEach()를 사용했는데, subject.Name에 값이 없어도 함수가 반환되지 않고 다음 동작을 실행하는 문제가 발생했다. isInvalid(grade) { if (this.$StringUtils.isBlank(grade.name)) { return true; } grade.subjectList.forEach(subject -> { if (this.$StringUtils.isBlank(subject.Name)) { return true; } }); if (this.$StringUtils.isBlank(grade.year)) { return true; } return false; } return true/false를 하면 ..
-
OptionalSTUDY/백엔드 2021. 5. 6. 14:23
java.util.Optional 클래스 Optional 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해주는 래퍼 클래스(Wrapper class)이다. 따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있다. 이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다. 즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 된다. * Wrapper class(래퍼 클래스)란? 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)라고 한다. 래퍼 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해..
-
StreamSTUDY/백엔드 2021. 4. 28. 17:58
Stream '데이터의 흐름’이다. 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다. 람다를 이용해서 코드의 양을 줄이고 간결하게 표현할 수 있다. 즉, 배열과 컬렉션을 함수형으로 처리할 수 있다. 병렬처리(multi-threading)가 가능하다. 스트림 인스턴스를 생성해서 필터링, 매핑, 정렬, 그룹핑 등의 중간처리와 합계, 평균, 카운팅, 최대값, 최소값 등의 최종 처리를 파이프라인(Pipelines)으로 해결한다. 생성하기 : 스트림 인스턴스 생성. 가공하기 : 필터링(filtering) 및 맵핑(mapping) 등 원하는 결과를 만들어가는 중간 작업(intermediate operations). 결과 만들기 : 최종적으로 결과를 만들어내..
-
SQL : INSERT+UPDATESTUDY/DB 2021. 4. 28. 16:15
보통 테이블에 값이 있으면 INSERT없으면 UPDATE를 할 때 쿼리를 세 번 실행한다. 값이 있는지 없는지 SELECT 값이 없으면 INSERT 값이 있으면 UPDATE 하지만 이걸 한 번에 해결해주는 쿼리문이 존재한다. 해당 쿼리문은 INSERT와 UPDATE를 같이 할 때 사용하는 것으로, 테이블에 값이 존재하지 않으면 INSERT하고, 존재하면 지정된 컬럼을 UPDATE한다. MySQL : ON DUPLICATE KEY UPDATE INSERT INTO [TABLE] - UPDATE 또는 INSERT할 테이블 혹은 뷰 ( [COLUMN1] , [COLUMN2] , [COLUMN3] ) VALUES ( [VALUE1] , [VALUE2] , [VALUE3] ) ON DUPLICATE KEY UPD..
-
Vue.jsSTUDY/프론트엔드 2021. 4. 28. 15:34
vue.js를 사용하면서 발생했던 문제 - 부모 component의 데이터 변화를 자식 component에서 감지하지 못함. 부모 component의 데이터를 자식 component에 props으로 전달. 자식 component에서는 전달받은 데이터를 기반으로 자신의 데이터를 set 부모 component에서 ajax로 새로운 데이터를 가져오지만, 자식 component의 데이터는 ajax로 가져오기 전 데이터를 계속 가지고 있는 문제 발생! 원인 : 부모 component의 데이터가 변경됐지만, 자식 component에서는 mounted()로 처음에만 데이터를 set하고 있기 때문에 변경된 것을 인식하지 못하고 계속 이전 데이터를 유지하고 있었다. 해결 : watch()를 통해 부모 component로..
-
Ajax CacheSTUDY/프론트엔드 2021. 4. 28. 14:01
Internet Explorer 11에서 데이터를 저장한 후 다시 조회할 때 새로 저장한 값을 가져오지 못하는 문제가 발생함. 데이터를 저장 또는 수정 변경된 데이터를 다시 조회해서 화면에 출력 변경된 데이터가 아닌 이전 데이터가 출력 => 검색해서 찾아보니 IE에서는 데이터를 조회할 때 브라우저의 캐시값을 사용하는 것이 원인이었다. * 해결 방법 쿼리스트링에 타임 스탬프를 전달하는 방법 POST 메소드를 사용하는 방법 캐시 컨트롤(Cache-Control) 헤더를 사용하는 방법 1. 쿼리스트링에 타임 스탬프를 전달하는 방법 jQuery.ajax({ cache : false }) cache (default: true, false for dataType 'script' and 'jsonp') Type: B..