2022/02 44

[Spring] DTO vs VO

※본 글은 제 주관적인 생각을 나타낸 글입니다. 주의해주세요.※ 먼저 이 글에서 DTO에 대해 설명하고 있지만, 다시 한 번 더 자세히 설명하겠습니다. DTO(Data Transfer Object) DB에서 검색하기 위해 DAO와 함께 사용되는 경우가 종종 있다. 저장 및 검색 외에 로직을 가지지 않는다. (비지니스 로직 가지지 않음) 가변 레이어와 레이어 사이에서 사용 가능 VO (Value Object) 값이 동일하다면 동일한 객체로 봄 불변 비지니스 로직을 가질 수 있다. DTO를 대신하여 표현하기도 한다. equals와 hashcode를 재정의를 해야한다. 모든 레이어에서 사용 가능 위 내용들은 이 글을 참고하였습니다. 사실 제목처럼 뭐를 사용하는 것이 맞다는 정답도 없고, 논쟁이 많기 때문에 사..

Spring 2022.02.28

일상이에요

곧 개학을 하여 다시 학교로 복귀해야하는 데 오잎 클로버입니다. 현재 SpringBoot에 대해서 다시 처음부터 차근차근 공부하고 있습니다. 강의를 구매해서 들어볼려고 했지만, 가격이 문제라기보다는 제가 강의를 듣는 동안 계속 딴짓을 할 것 같아 Youtube에 있는 강의, 그리고 고수 분들께서 올려놓은 블로그 글들을 참고해서 공부를 하고 있습니다. (대부분의 강의 길이는 길기에 비교적 짧은 Youtube 강의를 되도록 봅니다.) 공부를 하고 나면 코드를 수정해서 고쳐보거나 아니면 기능을 추가하며 일종의 복습도 하고 있습니다. (문제는 자꾸 까먹어서;; 계속 보게된다는 점입니다.) 그리고 진짜 일상 이야기를 하자면, 현재 저는 머리를 기르고 있는 데 좀 안 어울리는 것 같기도 하고 머리가 상한 것 같기도..

일상 2022.02.27

[공부/자바] JVM과 작동원리

자바라는 프로그래밍 언어는 어떤 플랫폼에서든 소스코드 변경이 없어도 실행할 수 있습니다. 즉 어떤 CPU나 OS에서든 실행할 수 있단 뜻입니다. 그래서인지는 몰라도 웹 어플리케이션 개발에도 사용되고, 안드로이드에서도 코틀린을 밀어주기 이전엔 자바로 기능들을 구현했습니다. 이를 가능하도록 이번 주제인 JVM이 있었기 때문입니다. JVM이란? JVM은 원래 Java Virtual Machine의 약어로, "자바 가상 머신"이라고 번역할 수 있습니다. 가상 머신의 정의는 다음과 같습니다. 특정한 프로그램이 실행될 수 있도록 컴퓨터에 가상 실행 환경을 만들어 주는 소프트웨어가 설치된 컴퓨터 JVM 검색 결과의 문서를 찾아보면 JVM은 자바 바이트코드를 실행할 수 있는 주체다. 일반적으로 인터프리터나 JIT 컴파..

공부/Java 2022.02.27

[공부/자바] JCF (Java Collection Framework)란?

자바 컬랙션 프레임워크 (JCF) 란? Java에서 데이터를 저장하는 기본적인 자료구조들을 한 곳에 모아 관리하고 편하게 사용하기 위해서 제공하는 것을 의미한다. 즉, 데이터를 담는 그릇들에 대한 정의를 모아놓은 프레임워크를 의미하며, 값의 성격이나 용도에 따라서 활용 방법에 따라 다양한 컨테이너를 제공한다. 다음은 JCF의 상속 구조이며 사용 용도에 따라 List, Set, Map 3가지로 요약할 수 있다. 각 인터페이스별 특징 List Interface (순서 O, 중복 O) LinkedList : 양방향 포인터 구조로, 데이터의 삽입/삭제가 빈번할 경우 유용하다(데이터의 위치 정보만 수정하면 되기 때문에). 스택/큐/양방향 큐 등을 만들기 위한 용도로 사용된다. 검색은 ArrayList에 비해 비효..

공부/Java 2022.02.26

[공부/서버] 프록시 서버란?

프록시 서버(Proxy Server)란? 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가르키는 말입니다. 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 프록시, 그 중계 기능을 하는 것을 프록시 서버라고 부릅니다. 프록시 서버 중 일부는 프록시 서버에 요청된 내용들을 캐시를 이용하여 저장해 둡니다. 이렇게 캐시를 해 두고 난 후에, 캐시 안에 있는 정보를 요구하는 요청에 대해서는 원격 서버에 접속하여 데이터를 가져올 필요가 없게 됨으로써 전송 시간을 절약할 수 있게 됨과 동시에 불필요하게 외부와의 연결을 하지 않아도 된다는 장점을 갖게 됩니다. 또한 외부와의 트래픽을 줄이게 됨으로써 네트워크 병목 현상을 방지..

공부/서버 2022.02.25

[공부/서버] CORS란?

웹 개발을 하다 보면 최소한 한 번 이상은 CORS 정책 위반으로 인해 에러가 발생해본 경험쯤은 있을 것입니다. 저 역시 저 혼자서 Spring & React를 공부해보고자 토이 프로젝트를 제작하는 도중 이 이슈를 처음 겪게 되었습니다. 당시, React, Spring 환경 둘 다 로컬 환경에서 진행하였고, Spring으로는 REST API를 먼저 완성시킨 후, React로 API 서버와 통신을 시도했었습니다. API 서버와 통신을 진행하여 데이터를 받아오면 되는 단순한 작업이었기에 아무 생각 없이 통신을 진행했는 데, 콘솔에서 에러를 뱉어내어 꽤 당황하였던 경험이 있습니다. (경험...) 지금 보면 나름 친절하게 해결방법을 알려주는 에러 메시지라고 생각이 들지만, 웹 어플리케이션 개발 경험이 전무하던 ..

공부/서버 2022.02.24

[공부/자바] 프로세스와 쓰레드의 차이

프로세스, 쓰레드, 그리고 JVM 쓰레드, 멀티 프로세스, 멀티 쓰레드. 이렇게 5가지를 설명하고자 합니다. 프로그램(Program)이란? 사전적 의미: 어떤 작업을 위해 실행할 수 있는 파일 프로세스(Process)란? 사전적 의미: 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체) 운영체제로부터 시스템 자원을 할당받는 작업의 단위 즉, 동적인 개념으로는 실행된 프로그램을 의미합니다. 할당받는 시스템 자원의 예시) CPU 시간, 운영되기 위해 필요한 주소 공간, Code Data, Stack, Heap의 구조로 있는 독립적인 메모리 영역 특징) 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당 받음..

공부/Java 2022.02.23

[공부/자바] SOLID에 대해서

SOLID란? 객체지향 설계 5원칙인 SOLID, 각 원칙들의 영어 앞글자를 따서 SOLID라고 합니다. SPR (Single Responsiblity Principle): 단일 책임 원칙 OCP (Open Closed Principle): 개방 폐쇄 원칙 LSP (Liskov Subsitution Principle): 리스코프 치환 원칙 ISP (Interface Segregation Principle): 인터페이스 분리 원칙 DIP (Dependency Inversion Principle): 의존 역전 원칙 위 원칙들은 응집도를 높이고, 결함도는 낮추자는 고전 원칙을 객체 지향의 관점에서 재정립한 것으로 볼 수 있습니다. SRP (Single Responsiblity Principle)이란? SRP ..

공부/Java 2022.02.22

[Spring] Spring Transaction 세부 설정 설명

※ 이 글은 이 글과 연결되어 있습니다! 참고해주세요. ※ Spring 트랜잭션에는 4가지의 세부 설정이 가능합니다. 트랜잭션 전파 격리 수준 제한 시간 읽기 전용 트랜잭션 전파 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있거나 없을 때 어떻게 작동할 것인가를 결정하는 방식을 의미합니다. Spring이 지원하는 전파 속성은 다음의 7가지가 있습니다. REQUIRED SUPPORTS MANDATORY REQUIRES_NEW NOT_SUPPORTED NEVER NESTED 저도 자세히는 모르기때문에 간략하게만 설명하도록 하겠습니다;; 자세히 아시는 분들은 댓글 달아주시면 감사하겠습니다.. 1. REQUIRED default 속성으로 모든 트랜잭션 매니저가 지원하며, 대개 이 속성을 사용합니다. 미리 시작..

Spring 2022.02.21

[괴발개발] TODO 웹 개발 노트 - 도커(Docker) 배포

먼저 docker를 사용해서 배포를 했습니다. ssh 역시 적용하고자하였으나 잘 되지않아 일단 localhost에서만 하도록 하였습니다. 기존에는 테스트 단계였기에 인-메모리 DB인 H2 데이터베이스를 사용하였습니다. 현재는 mysql 8.0 데이터베이스를 적용하였습니다. 먼저 DB를 docker에 저장하면서, 어플리케이션을 같이 실행(배포)하기 위해 docker-compose.yml를 사용해서 배포를 했습니다. application.yml에 있는 정보 일부를 docker-compose.yml로 넘깁니다. 그리고 ./gradlew build를 사용해서 빌드를 하고 jar를 생성하여 도커에 배포합니다. version: "3" services: database: image: mysql container_na..

Spring/괴발개발 2022.02.21