Convention over Configuration(CoC) 흔히 "설정 이상의 관례", "설정보다 관례" 라고 알고있는
코디추천 서비스 프로젝트를 하면서 의문점이 생겼다.해당 사진처럼 어떤 코디를 추천받을지 필터링하는 과정에 값을 넣는 방법은 크게 2가로 분류될것이다.클라이언트에 하드코딩 해놓기백엔드에서 값 내려주기백엔드 개발을 하는 입장으로써 어디까지 값을 내려주고 어디까지 하드코딩을
읽은 책그림으로 배우는 Http NetWorkBasic
HyperText Transfer ProtocolW3 상에서 정보를 주고 받을 수 있는 프로토콜주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용Hyper Text Transfer Protocol SecureHTTP에 암호화가 추가된 프로
OSI 7 계층은 네트워크에서 통신이 일어나는 과정을 7단계로 나눈것을 말하며, 국제표준화기구에서 네트워크 간의 호환을 위해 OSI 7 계층이라는 표준 네트워크 모델을 만들었다.OSI 7계층은 응용, 표현, 세션, 전송, 네트워크, 데이터링크, 물리계층으로 나뉨.전송
스케일 업과 스케일 아웃은 인프라 확장을 위한 두 가지 방법이다.스케일 업은 기존 서버의 사양을 업그레이드해 시스템을 확장하는 것을 말한다.CPU나 RAM 등을 추가하거나 고성능의 부품, 서버로 교환하는 방법이다.이처럼 하나의 서버의 사양을 업그레이드 하기에 수직 스케
통신 프로토콜 또는 통신 규약은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계이다. 즉 통신 규약 및 약속이다.즉 통신을 하기 위한 약속, 컴퓨터와 컴퓨터 사이의 언어라고 생각하면 된다.구문(Syntax) : 전송하고자 하는 데이터의 형식(
웹 서버란 HTTP 프로토콜을 기반으로 클라이언트가 웹 브라우저에서 어떠한 요청을 하면 그 요청을 받아 정적 컨텐츠를 제공하는 서버이다. 정적 컨텐츠란 단순 HTML 문서, CSS, 이미지, 파일 등 즉시 응답 가능한 컨텐츠이다. 이때 웹 서버가 정적 컨텐츠가 아닌 동
컴파일이란 개발자가 작성한 소스코드를 기계가 이해할 수 있는 2진수의 바이너리 코드로 바꿔주는 과정이다. 흔히 하는 JAVA, C, C++ 등이 컴파일 언어이며 실행되기 전에 반드시 컴파일이 되어야한다. 컴파일이 완려된 이후 사용자에 의해서 응용프로그램이 동작되어지는
트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야할 일련의 연산들을 의미한다.데이터베이스의 상태를 변환시킨다는것이 무엇일까?간단하게 아래의 SQL을 이용하여 데이터베이스를 접근하는것을 의미한다.SELEC
자바 8에서 추가된 스트림은 컬렉션, 배열 등에 저장된 요소들을 하나씩 순회하며 코드를 실행할 수 있느 기능이다.불필요한 for문을 사용하지않고, 람다식을 사용하여 코드를 간결하고 직관적이게 만들 수 있다.아래와 같은 특징을 가진다.Stream은 데이터를 담는 저장소가
자바 언어를 공부했음에도 클래스 변수와 인스턴스 변수의 차이점을 모르고 사용해왔단거같아 정리를 해보려고 한다. 💡 클래스 변수(class variable) 클래스 내에 static 키워드로 선언된 변수 처음 JVM이 실행되어 클래스가 메모리에 올라갈 때 ~ 프로그램
IntelliJ로 빌드 시 Gradle로 빌드할지 IntelliJ IDEA로 빌드할지 설정할 수 있다. 강의를 통해 IntelliJ IDEA를 통해 빌드하면 속도가 향상된다는것만 알 뿐 자세한 내용은 모르고 넘어갔는데 오늘 이 부분을 알아보자.이 부분에 대헤 알아보려면
공부를 하면서 Maven 과 Gradle의 정의 및 차이점을 모르고 사용하고있는거 같았다. 오늘은 Maven과 Gradle의 정의와 둘의 차이점을 알아보자.Maven과 Gradle은 모두 빌드 관리 도구이다.빌드 관리 도구란 무엇일까?빌드는 소스코드 파일 컴퓨터에서 실
스타일 추천 프로젝트를 진행중에 erd 다이어그램을 제작하며 배치작업을 처음 접했다.스타일 게시물의 좋아요 수와, 업로드 시간을 계산하여 랭킹을 부여해야한다.여기서 배치작업이란, 계산 뿐만 아니라 이 계산을 주기적으로 일정한 시간에 랭킹에 적용하는거의 범위까지를 얘기한
반정규화 (Denormalization)는 데이터베이스 설계에서 정규화(Normalization)의 반대 개념이다. 정규화는 데이터베이스 테이블을 작은 단위로 분해하여 데이터 중복을 최소화하고 데이터 무결성을 보장하기 위한 프로세스이다.반면에 반정규화는 성능 최적화와
Style Mate 프로젝트에서 카테고리 이름을 프론트에서 하드코딩하는 방법이 아닌 서버에서 관리하기로 결정했었다.해당 게시글 참고 클라이언트 하드코딩 어디까지?이제 한가지가 또 고민이다.서버에서 관리하는 방법은 크게 2가지로 나눌 수 있다.ENUM 클래스를 사용한 관
Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)이다.데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소다.데이터를 저장하고 관리하는 목적이라면, 데이터베이
도커(Docker)란 리눅스 컨테이너에서 리눅스 어플리케이션을 프로세스 격리기술을 사용하여더 쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트이다. 도커는 일반적으로 도커 엔진(Docker Engine) 혹은 도커에 관련된 모든 프로젝트를 말한다.도커
Doker를 사용하여 MySQL을 설치하는 방법을 알아보자.엔티티 생성 후 데이터베이스 연결하는 과정은 생략하겠다.MYSQL_ROOT_USER, MYSQL_ROOT_PASSWORD 값은 민감한 정보이므로Git Action Secrets를 활용하여 숨김.자세한 내용은 깃
에러 코드 제작 발생한 예외를 처리해줄 예외 클래스 생성 @RestControllerAdvice 구현하기 공통 ApiResponse 개발 성공, 예외를 ApiResponse 하나로 처리 컨트롤러 성공시 ApiResponse 성공 객체 반환 실패시 @RestCon
응답 변환 Comment 엔티티를 대신할 CommentDto 생성 클라이언트에서 필요로하는 정보를 필드로 생성 Comment 엔티티에 Dto로 변환하는 메서드 추가 컨트롤러 요청 변환 dto 생성 댓글을 생성하는데 필요한 정보 서비스 코드 수정 컨트롤러
댓글을 저장하는 서비스 코드파라미터가 많아져 관리와 가독성이 떨어질 경우 saveWithParams 사용엔티티로 변환하는 로직 보유SaveCommentParam으로 변환하는 로직 보유
프로그래밍을 하다보면 동시성 처리를 할 경우가 있다.여기서 동시성과 병렬성을 헷갈릴 수 있는데 오늘 둘의 개념과 차이를 정리해보자.동시성은 하나의 시스템이 여러 작업을 동시에 처리하는 것처럼 보이게 하는 것이다.실질적으로는 한번에 하나의 작업만을 처리한다.동시성은 대개
프로젝트를 진행하며 application.\* 파일등의 정보나 API KEY값들처럼 깃허브 저장소에서는 공개되지 않았으면 하는 정보들이 있다.오늘은 Gitgub action 에서 secrets을 사용하여 값들을 관리하는 방법을 알아보자.github actions는 gi
자료 구조(데이터 구조)는 컴퓨터 메모리를 더 효율적으로 관리하기 위해 새로 정의하는 구조체로 일종의 메모리 레이아웃 또는 지도로 생각하면 된다.자료 구조 중에는 연결 리스트, 해시 테이블, 스택, 큐, 딕셔너리 등이 존재한다.연결 리스트는 저장되어있는 값들이 여러군데
프로젝트 진행 중 스타일 delete를 테스트중에 외래키 제약 조건 위반 예외가 발생하였다.(java.sql.SQLIntegrityConstraintViolationException)해당 스타일이 댓글을 가지고 있으므로 가지고있는 댓글들에 있어서 처리할 방법을 몰라 예
프로젝트 중 게시물의 조회수를 증가시키는 api를 개발중이였다.처음에는 Style 테이블의 viewCount 컬럼을 NotNull로 지정해줬었는데save, update 등 기능에는 클라이언트에서 viewCount값을 받을 필요가없었다.따라서 해당 dto등에서 viewC
스프링 프레임워크란, Java를 사용한 프레임워크이다.간단히 스프링(Spring) 이라고도 하며, 동적인 웹 사이트를 개발하기 위해 여러가지 서비스를 제공한다.스프링의 3대 특징을 나타낸 삼각형이다.스프링은 POJO를 기반으로 AOP, PSA, Ioc/DI 특징을 가진
@RequestBody는 클라이언트가 전송하는 JSON 형태의 HTTP Body를 Java 객체로 변환 시켜주는 역할을 한다.값을 주입하지 않고 값을 변환 시키므로, 변수들의 생성자, Getter, Setter가 없어도 정상적으로 할당된다.클라이언트측에서 넘어오는 JS
스프링 부트와 스프링 프레임워크의 차이점을 알아보자.스프링 부트는 빠르게 프로젝트를 설정하고 실행할 수 있는 기능을 제공한다. 설정의 자동화와 기본값의 제공으로 초기 개발 단계를 빠르게 진행할 수 있다. 스프링 부트는 Tomcat, Jetty등을 내장된 서버를 제공하여
자바 어플리케이션은 어플리케이션 동작을 제공하는 객체들로 이루어져 있다. 이때, 객체들은 독립적으로 동작하는 것 보다 서로 상호작용하여 동작하는 경우가 많다.이렇게 상호작용하는 객체를 객체의 의존성 이라고 표현한다.스프링에서는 스프링 컨테이너에 객체들을 생성하면 객체끼
Continuous Integration의 약자이며, 소프트웨어 개발 프로세스의 일환이다.코드 변경 사항이 자동으로 빌드 및 테스트되어 공유 코드 저장소에 통합되는 프랙티스를 나타낸다.CI의 목적은 코드 변경으로 인해 발생할 수 있는 오류를 최소화하고, 팀원 간의 협업
💡 요구사항 사용자는 회원가입시 이메일로 인증을한다. 클라이언트는 사용자의 이메일로 서버에게 인증번호를 요청한다. 서버는 랜덤 인증번호를 생성하고 사용자의 이메일에 인증번호를 전송한다. 서버는 전송한 인증번호를 redis에 저장한다. 클라이언트는 서버에게 인증번호 검
StringUtils.equals() 메서드를 사용하면 두개의 문자열을 비교하여 동일한 문자면 true를 다른 문자면 false를 반환한다. 또한 중요한 특징은 null은 예외없이 처리된다. 즉 값이 null일 경우 npe가 발생하지않고 null을 반환한다.Java S
회원가입시 이메일로 본인인증을 하는 요구사항을 개발중에 redis에 인증번호를 저장해놓고 사용하기로 개발하였다.redis의 key값은 클라이언트측에서 받은 이메일로 key를 저장한다.처음에는 아래처럼 그냥 + email 값으로 key를 저장하였었다.이제 MessageF
브랜치는 개발작업에서 중요한 역할을 한다. 우리는 왜 브랜치를 사용해야할까? 만약 브랜치를 사용하지 않는다고 생각해보자. 메인 브랜치에서 모든 작업이 이루어질탠데 하나의 기능을 위해 여러개의 커밋을 하다보면 메인 브랜치의 코드가 불완전한 상태로 존재하게 된다.협업을 하
💡 애자일이란? 요즘 프로그래밍을 하다보면 애자일이란 단어를 한 번 쯤은 들어봤을것이다. 흔히들 애자일 방법론 이라고 하는데 이게 무엇일까? 쉽게 말하자면, 유연하게 일하는 방식이라고 정의할 수 있을거 같다. 애자일이란 용어 자체는 '기만한', '재빠른', '민첩한
비교적 간편하게 문서를 작성할 수 있다.코드상의 추가되는것이 없어 코드의 가독성을 해치지않는다.자동화가 되지않아 사람이 수정하는걸 놓치면 실제 API 스펙과 달라진다.자동화로 문서와 코드의 일치를 유지할 수 있다.프로덕션 코드에 문서화에 대한 코드가 포함되므로 가독성이
프레임워크와 라이브러리의 차이를 알아보자. 먼저 각각의 정의를 먼저 알아보자. 💡 프레임워크(Framework)란? > 개발자가 소프트웨어를 개발함에 있어 코드를 구현하는 개발 시간을 줄이고, 코드의 재사용성을 증가시키기 위해 일련의 클래스 묶음이나 뼈대, 틀을 라
인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다.책으로 예를 들어보자. 페이지가 많은 책에서 내가 원하는 내용을 찾기 위해 모든 페이지를 찾으려면 많은 시간이 걸린다. 따라서 책에는 색인을 추가하여 원하
데이터베이스에서 쿼리가 요구하는 데이터를 찾는 방법은 여러가지가 있다.Table Full Scan(Sequential Scan)Index Range ScanIndex Full ScanIndex Unique ScanIndex Skip ScanIndex Fast Full
싱글톤 패턴은 특정 클래스의 인스턴스가 오로지 1개만 생성되도록 하는 디자인 패턴이다. 즉, 생성자를 통해 여러번 호출되더라도 처음에 만들어놓은 인스턴스가 계속 사용된다.메모리 낭비 방지최초 한번의 new를 통해 생성된 메모리 영역을 계속 사용하기에 불필요한 메모리 사
💡 Query Plan이란? > SQL을 처리하는 최저비용의 경로를 생성해주는 DBMS 내부 핵심엔진인 쿼리 옵티마이저가 쿼리를 수행할 때 생성한 최적의 처리경로를 말한다. MYSQL에서는 실행할 쿼리문 앞에 EXPLAN을 붙여 정보를 살펴볼 수 있다.