ALL Post 202

파일업로드 input[files] FileList 동적으로 변경하기

파일업로드 시 input태그 FileList 동적으로 변경하기 파일업로드 기능을 구현하면서 겪은 문제. 사용자가 파일을 업로드하면 미리보기 형식으로 자신이 어떤 파일을 올렸는지 확인할 수 있어야 한다. 혹여 잘못 올린 파일이 있다면 해당 파일만 따로 삭제할 수 있어야 한다. 예시 : 이때 X버튼을 눌러서 화면에서 파일을 지워줘도 File Input Tag에는 그대로 해당 파일이 남아있다. 예시: 업로드한 파일 8개 중 7개를 지웠는데 화면에서는 삭제됐지만, Input창에는 그대로 남아있다. File Input 내부적으로 files라는 FileList를 가지고 있다. 문제는 FileList의 값을 바꿀 수 없기 때문에 삭제된 파일을 input tag에 반영할 수 없다는 것이다. files의 값을 변경하려고..

Study 2021.06.12

[Database] Transaction, Lock

Transaction 트랜잭션은 DBMS에서 데이터를 다루는 논리적인 작업 단위다. 트랜잭션은 전부 수행되거나, 전부 수행되지 말아야 한다.(All or Nothing) 트랜잭션의 동작 원리 A계좌의 값을 데이터베이스에서 메모리 버퍼로 읽어온다. B계좌의 값을 데이터베이스에서 메모리 버퍼로 읽어온다. A계좌에서 10000원을 인출한 값을 저장. B계좌에서 10000원을 입금한 값을 저장. A계좌의 값을 메모리 버퍼에서 데이터베이스에 기록 B계좌의 값을 메모리 버퍼에서 데이터베이스에 기록 이런 작업이 있다고 했을 때, 트랜잭션의 수행 과정은 두 가지 방법으로 나눌 수 있다. 이 두 가지 방법은 커밋이 어느 위치에 들어가느냐에 따라 달라진다. A. 4번 작업을 마치고 커밋한다. B. 6번 작업을 마치고 커밋..

Study 2021.05.25

Flyway

Flyway Flyway는 데이터베이스 마이그레이션 툴이다. 여기서 마이그레이션이란, 스키마의 버전을 관리한다고 이해할 수 있다. 왜 버전을 관리해야 할까? 수많은 이유가 있을 것이다. 개발 환경에서 스키마를 변경하고 운영환경에 적용하지 않는 실수를 막는다거나, 이전 버전으로 rollback이 필요할 수도 있다. Flyway의 작동방식 flyway는 지정된 schema history table을 찾는다. 이제 막 flyway를 적용해서 아직 스키마 히스토리 테이블이 존재하지 않는다면 새롭게 생성한다. 여기서 schema history table이란 말 그대로 flyway가 스키마의 버전을 관리하는 테이블을 말한다. 히스토리를 관리하는 테이블이 생성되면, Flyway는 마이그레이션을 위해 classpath..

Study 2021.05.16

[Kotlin] 코틀린이 null을 다루는 방식 ? 연산자와 ?: 엘비스 연산자

Kotlin ? keyword Java에서는 객체의 메서드를 호출할 때 NP가 발생할 수 있으므로 메서드 호출 전 null체크가 필요하다. if(foo != null) foo.bar 코틀린은 안전한 null 체크를 위한 ?연산자를 제공한다. foo?.bar() //null이라면 null, null아니라면 결과 값이 출력된다. 하지만 역시 안전한 호출의 결과 타입도 null이 될 수 있으므로 유의해야 한다. 이를 테면 String.toUpperCase의 결과는 String을 반환한다. 반면 String?.toUpperCase식의 결과 타입은 String?이 된다. ?연산자를 연속해서 사용하는 것도 가능하다. class Address(val streetAddress: String, val zipCode: I..

Kotlin 2021.05.15

@ControllerAdivce를 사용한 예외 처리 로직 분리

@ControllerAdvice를 사용하여 예외처리 로직 분리하기 과제 프로젝트를 개선하면서 받은 피드백 중 하나는 @ControllerAdvice를 통해 예외 처리 로직을 분리하라는 것이었습니다. 아래 코드를 보면 예외를 잡고 발생하는 예외마다 다른 Http Status code를 반환했습니다. 예시 코드 @PostMapping fun requestApartmentToBeMoved(@RequestBody apartmentRequest: ApartmentRequest, httpSession: HttpSession) : ResponseEntity { logger.info("apartmentRequest:{}", apartmentRequest) z try { val apartment = apartmentVi..

Spring 2021.05.15

인프런 Kotlin으로 개발하는 Spring Boot Web MVC - Web개론

Web이란? 웹은 인터넷에 연결된 컴퓨터를 통해 사람들이 정보를 공유할 수 있는 전 세계적인 정보 공간이다. 웹의 용도는 다양하게 나눌 수 있다. Web site(google, naver, ...) User Interface(Browser) API(ex.Open API) 이 세 가지 정도가 가장 흔하게 접할 수 있는 웹의 형태다. 웹의 기반 HTTP HTML을 주고 받기 위한 규약 URI 리소스 식별자다 HTML XML을 바탕으로 한 범용 문서 포맷. 브라우저는 HTML을 사용자가 알아볼 수 있는 형태로 표현하는 도구다. REST Client, Server 클라이언트와 서버가 서로 독립적으로 분리되어야 한다. Stateless 요청에 대해 클라이언트의 상태가 서버에 저장하지 않는다. Cache 클라이언트..

Study 2021.05.15

객체지향 모델과 관계형 모델의 패러다임의 불일치

'The Object-Relational Impedance Mismatch'는 객체 모델을 관계형 모델에 저장할 때 발생하는 문제, 즉 패러다임의 불일치에서 오는 문제를 말한다. 이 문제를 해결하는 게 ORM의 과제다. Persistence Persistence란 애플리케이션의 데이터가 애플리케이션 프로세스 범위를 넘어서 지속되는 것을 말한다. Java용어로 치자면 객체의 상태거 JVM범위를 넘어서 유지되는 것이라고 생각하면 된다. 객체 모델 & 관계형 모델 RDBMS는 데이터를 테이블 형식으로 표현한다. 반면 자바 같은 객체지향 모델은 객체 그래프로 데이터를 표현한다. 따라서 객체를 테이블 형식으로 저장하면 다섯 가지 불일치 문제가 발생한다. 1.세분성(Granularity) 데이터베이스의 테이블 수보..

JPA 2021.04.26

[코드 스피츠 Programming101] 1강

이 글은 코드스피츠 채널에 올라온 영상을 보고 정리한 내용입니다. 프로그램 정확히 말하면 프로그램은 코드가 아니다. 실행 파일(.exe등)은 디스크에 저장되어 있는 파일일 뿐이다. 파일을 실행해서 OS가 명령과 값의 형태로 메모리에 적재한 상태가 프로그램이다. 메모리에 적재된 명령을 순차적으로 실행하고 나면 프로그램은 종료된다. 명령은 실행되기 위해 CPU로 올라온다. 보통 명령은 메모리를 이용해서 실행된다. CPU의 연산유닛은 제어 정보를 참고해서 메모리에 있는 값을 데이터유닛으로 불러온다. 연산유닛에서 어떤 연산할 때는 메모리에서 불러온 값과 명령을 사용해서 프로그램을 실행하고, 그 결과가 다시 메모리로 전파된다. 메모리에 명령과 값을 적재하는 과정을 로딩이라고 부른다. 명령(instruction)을..

[오브젝트03] 역할, 책임, 협력

역할, 책임, 협력 객체지향 패러다임의 핵심은 역할, 책임, 협력이다. 이것이 구현보다 중요하다. 다시 영화 예매 시스템을 보자. 위 표를 보면 알 수 있듯이 객체지향 원칙을 따르는 애플리케이션은 어떤 하나의 객체가 통제하지 않는다. 다양한 객체들이 자신의 일을 수행하면서 애플리케이션의 전체 기능을 완성한다. 여기서 중요한 점은 객체들이 '메세지'를 통해 상호작용한다는 것인데, 이것을'협력'이라고 한다. '책임'은 협력에 참여하기 위해 수행하는 로직이다. 객체가 가진 책임들이 모여 그 객체가 수행하는 '역할'을 구성한다. 협력 협력은 객체가 다른 객체에게 도움을 요청할 때 시작된다. 이것을 메세지 전송이라고 하는데, 객체가 협력할 때 사용하는 유일한 방법이다. 객체는 다른 객체의 내부 구현에 접근할 수 ..

Study/오브젝트 2021.04.07

[오브젝트02] 객체지향 프로그래밍

02 객치지향 프로그래밍_영화 예매 시스템 만들기 요구사항 2장에서는 영화 예매 시스템을 만든다. 주의할 점은 '영화'와 '상영'을 구분해야 한다. 관객은 영화를 예매하는 것이 아니라 상영을 예매한다. 특정한 조건을 만족하는 예매자는 할인을 받을 수 있다. 하나는 할인 조건이라고 부르고 하나는 할인 정책이라고 부른다. 할인 조건 순서조건 (예를 들어) 매일 10번째로 상영되는 영화를 예매하는 사용자들에게 할인 혜택을 제공한다. 기간 조건 특정 상영 시간대의 영화(상영)를 예매하는 사용자들에게 할인혜택 제공 할인 정책 금액 할인 비율 할인 영화별로 하나의 할인 정책만 할당할 수 있다. 할인 조건은 다수의 할인 조건을 함께 지정할 수 있다. 객체지향 프로그래밍 객체지향 프로그래밍을 하려면 이 두 가지에 집중..

Study/오브젝트 2021.04.01