[Java] DTO - Data Transfer Object, toEntity와 toDto
·
BackEnd/Java
학습 배경자바와 스프링 부트로 프로그래밍을 하면서 DTO를 사용을 해왔지만, 올바른 DTO의 정의를 알지 못했고 바람직한 사용이 아니라고 생각되었습니다. DTO를 제대로 알고 어떤 상황에서 사용해야 하는지 정리하기 위해 학습했습니다.DTODTO란 계층간 데이터 전송을 위해 도메인 모델 대신 사용되는 객체 입니다.여기서 계층이란, Controller, Service, Repository 등을 의미합니다.DTO는 순수한 데이터를 저장하고, 데이터에 대한 getter, setter 만을 가져야 한다고 정의 되어 있습니다. DTO는 어떠한 비즈니스 로직을 가져서도 안됩니다.DTO를 왜 사용하나요?처음에는 User 객체를 굳이 UserDto에 담에서 보내는 이유가 뭘까? 라고 생각을 했습니다.User 그대로 보내..
우테코 프리코스 1주차 미션 회고 및 정리 - 1
·
BackEnd/Java
우아한 테크 코스 1주차 미션인 문자열 덧셈 계산기를 구현하는 과정과 이를 통해 어떤 점에서 어려움을 겪었고 어떤 점을 개선했는지 정리하겠습니다.문자열 덧셈 계산기기능 요구 사항입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다.쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다.예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다.예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결..
[Java] 스트림이란? 스트림의 사용이유와 컬렉션과 비교 예제
·
BackEnd/Java
스트림이란? 스트림의 사용이유Stream자바 8 에서 추가된 Stream은 데이터 처리기능을 가지고 있으며, 데이터 처리 효율을 높여줍니다.Stream의 사전적 의미는 ‘시냇물’이라는 의미를 가지며, 연속적인 사물이나 사람의 흐름 이라고 정의합니다.Stream은 시간상에 나타나는 일련의 데이터 요소라고 정의함. 이는 데이터 집합의 의미보다는 연속적인 데이터의 흐름이라고 말하기 더 적합합니다.결론적으로 Stream을 이용하면 일련의 데이터 처리 연산을 함수형 연산을 통해 표준화된 방법으로 쉽게 가공하고 처리할 수 있습니다.Stream의 사용 이전에는 Collection으로 사용했었고 이는 코딩작업이 길어지며 가독성이 불편하여 작업할 때의 애로사항이 많았습니다.하지만 Stream은 기존의 Collection..
[Test] TDD - Test Driven Development
·
BackEnd/Java
TDD란?TDD = TFD(Test First Development) + 리팩토링TDD란 프로그래밍 의사결정과 피드백 사이의 간극을 의식하고 이를 제어하는 기술이다. - 켄트벡, Test Driven Development by Example 중TDD의 아이러니 중 하나는 테스트 기술이 아니라는 점이다. TDD는 분석 기술이며, 설계 기술이기도 하다. - 켄트벡, Test Driven Development by Example 중TDD를 하는 이유디버깅 시간을 줄여준다.동작하는 문서 역할을 한다.변화에 대한 두려움을 줄여준다.TDD 사이클실패하는 테스트를 구현한다.테스트가 성공하도록 프로덕션 코드를 구현한다.프로덕션 코드와 테스트 코드를 리팩토링한다.TDD 원칙원칙 1 - 실패하는 단위 테스트를 작성할 때까..
[Java] synchronized - 동기화
·
BackEnd/Java
한번의 하나의 스레드만 사용할 수 있게 만든다.둘 이상의 스레드가 공동의 자원을 공유하는 경우, 순서에 맞춰서 접근이 필요하고  스레드에 대한 동기화를 이용해서 하나의 자원에 접근하려 할 때, 주어진 순간에는 오직 하나의 스레드만 접근 가능하도록 하는 것모든 객체는 내부에 자신만의 lock을 가지고 있다.- 모니터 락 이라고 부른다- 객체 내부에 있어서 확인이 어렵다스레드가 synchronized 키워드가 있는 메서드에 진입 하려면 반드시 해당 인스턴스의 락이 있어야 한다. 이 상황을 실제 우리가 살아가는 상황에 대입해볼 수 있다.(저는 개인적으로 락 = 키 라고 생각하는것이 이해가 빨랐습니다.)만약 우리가 화장실에 들어가야 하는 상황이라고 가정한다. 화장실에 들어가려고 하는데, A가 이미 들어가서 사용..
[Java] 메모리 가시성 - volatile
·
BackEnd/Java
main 스레드와 work 스레드가 존재 할 때, 맨 처음에 메모리에서 runFlag의 값을 가져오고 main 스레드와 work 스레드는 메인스레드의 runFlag값인 false를 가지고 있다. main -> falsework -> false 이 상태에서 메인 메모리에 접근하는 것이 아니라, main과 work는 runFlag의 값을 복사해서 스레드에서 캐시 메모리에 가지고 있게 된다. 캐시 메모리는 cpu와 매우 근접해있으며, 속도도 매우 빠른 메모리이기 때문에, 속도 측면에서 매우 유리하다. 하지만 비용이 비싼 메모리 이기 때문에, 큰 용량을 구성하기는 어렵다. 본론으로 돌아와서 main과 work의 캐시 메모리에 저장이 되어있고 이 상태를 main 스레드에서 변경하게 된다. runFlag를 true..
[Java] 프로세스와 스레드 - 1
·
BackEnd/Java
프로세스와 스레드멀티태스킹과 멀티프로세싱만약 프로그램을 두개 이상 동시에 실행한다고 가정해보자. 연산을 처리할 수 있는 cpu 코어는 1개만 있다고 가정한다. 하나의 cpu 코어가 매우 빠르게 두개의 작업을 번갈아 가면서 처리하게 되면 사람은 이것이 같이 동시에 실행된다고 느끼게 된다. 이렇게 각 프로그램의 실행 시간을 분할해서 마치 동시에 실행되는 것 처럼 하는 기법을 시분할 기법이라고 한다. 그리고 이렇게 하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 것을 멀티태스킹 이라고 한다. cpu에 어떤 프로그램이 얼마만큼 실행될지는 운영체제가 결정하는데 이것을 스케줄링 이라고 한다. 이때 단순히 시간으로만 작업을 분할하지는 않고, cpu를 최대한 활용할 수 있는 다양한 우선순위와 최적화기법을 사용한다...
[Java] 컬렉션 프레임워크 와 배열, 리스트
·
BackEnd/Java
배열과 같이 여러 데이터(자료)를 구조화해서 다루는 것을 자료 구조라 한다.자바는 배열 뿐만 아니라, 컬렉션 프레임워크라는 이름으로 다양한 자료 구조를 제공한다. 배열배열에서 인덱스 사용하면 매우 빠르게 자료를 찾을 수 있다.데이터를 넣거나 뺄때 처음부터 찾는게 아니라 인덱스 번째의 주소 값을 정확하게 입력하여 찾아가면 바로 찾을 수 있고, 그렇기 때문에 인덱스를 이용하면 빠르게 찾을 수 있음배열을 찾는 공식은 다음과 같다배열의 시작 참조 + (자료의 크기 * 인덱스 위치)만약 arr이라는 배열의 3번째 값을 찾는다고 했을때 공식을 적용하면 다음과 같다.(배열은 0번째 부터 시작이기 때문에 3번째가 곧 2번째 인덱스)arr[2] = x100(참조주소 예시) + (4byte(int) * 2) = 108결론..