목적 파일 컴파일러나 어셈블러가 소스코드를 컴파일 또는 어셈블해서 생성한 파일 c: 하나의 소스 코드로 각 기기에 맞는 목적 파일을 생성 java: 하나의 소스 파일로 어느 JVM에서든 실행시킬 수 있는 목적 파일 생성 반 기계어인 바이트 코드로 목적 파일 생성
연산자 연산자: 연산을 수행하는 기호 피연산자: 연산자의 연산 수행 대상 모든 연산자는 연산 결과를 반환한다. 플로우 차트 어떤 일을 처리하는 과정을 순서대로 간단한 기호와 도형으로 도식화한 것을 의미 이름붙은 반복문 goto문처럼 비슷한 것 같다. 써도 되는 문
구글이 제공하는 클라우드 백엔드 서버다양한 기능을 제공하지만, 따로 커스텀하기는 힘들다.간단한 프로젝트를 진행하며 Firestore를 활용해 데이터를 저장하는 용도로 많이 쓰일 듯 하다.구글의 클라우드 기반 NoSQL 데이터베이스정말 간단하게 구축하며 사용할 수 있다는
Access token의 기한이 만료되면 재발급 해줘야 됨Access token의 기간은 짧게(보통 1시간)Refresh token의 기간은 길게(보통 2주)이때 사용되는 토큰이 Refresh token사용자 회원가입 정보 입력.유효한 데이터가 들어왔다면 회원가입 처리
서브쿼리 쿼리문 안에 들어가는 쿼리문 SELECT, FROM, WHERE에 들어감 다중으로도 사용 가능함 With 서브쿼리로 만들어진 결과물을 테이블처럼 사용할 수 있게 만들어 줌
Firebase database NoSQL 기반 데이터 베이스 await getDocs() await addDoc() id를 무작위로 생성해주면서 추가 await setDoc(doc(db, "컬렉션 명", "id"), 데이터) 해당 컬렉션에서 id값을 가진 도큐먼트값을 데이터로 수정 이미 도큐먼트가 존재하면 수정 없으면 새...
바닐라 JS로 간단한 프로젝트를 진행하던 도중, 로그인 정보를 어디에 저장해야할 지 생각해보는 시간을 갖게 되었다. 만약, React나 Svelte같은 프론트 기술을 사용했더라면, 쿠키와 전역 상태 저장 관리 라이브러리(Redux나 Svelte store 등)를 통해 토큰 값이나 로그인 정보를 저장했을 것 같다. 그렇다면, 바닐라 JS로 프론트를 구현할...
JVM에 대해 알아보던 도중, 상수가 저장되는 위치에 대해 의문점이 생겨서 알아보는 시간을 갖게 되었다. String이 가지는 리터럴 값(문자열)이 Heap에 존재하는 공간인 String Pool에 저장된다는 것까진 알고 있었다. 그렇다면, 숫자나 다른 리터럴 값들은 어디에 저장되는 것일까? 정답은 Runtime Constant Pool인 듯 하다. ...
Nginx 비동기적으로 처리되는 웹 서버 수많은 트래픽을 처리하는 상황에서, 아파치 웹서버보다 처리가 더 용이 용도 정적 컨텐츠 호스팅 리버스 프록시 로드 밸런서 SSL Failover 문제있는 서버에 대해 연결을 조절할 수 있음 캐싱 정적 리소스를 캐싱 가능 구조 sites-available과 sites-enabled 구조는...
백엔드 서버를 EC2와 라즈베리파이 둘 중 어떤 컴퓨터를 사용하면 좋을지 생각하던 도중, 라즈베리파이를 사용했을 때 파일 전송과 원격 접속하는 방법에 대해 생각해보게 되었다. 그렇게 검색을 통해, SSH를 알게 되었다. SSH(Secure Shell) 원격지에 있
추상 클래스 클래스가 설계도라면, 추상클래스는 미완성된 설계 표준화 시킬 때 사용될 수도 있음 추상 클래스의 필드는 protected? private? 해당 클래스의 필드가 외부 클래스에서도 쓰인다면 private 로 선언하여 getter, setter를 사용 자
오류 일반적으로 회복이 불가능한 문제 시스템 레벨에서, 또는 주로 환경적인 이유로 발생 에러가 발생한 경우 이유를 분석해서 대응 예외 일반적으로 회복이 가능한 문제 대응 가능 코드레벨에서 할 수 있는 문제상황에 대한 대응을 예외 처리라고 함 컴파일 에러(예외) 컴파일할 때 발생하는 에러 및 예외 런타임 에러(예외) ...
프로세스와 스레드 프로세스 OS로부터 자원을 할당받는 작업의 단위 실행 중인 프로그램 스레드 프로세스가 할당받은 자원을 이용하는 실행의 단위 Java에서의 스레드 Java 프로그램을 실행하면 JVM 프로세스 위에서 실행된다. Java 프로그램 쓰레드는 Java 메인 쓰레드로부터 실행되며 JVM에 의해 실행된다. main 메...
병렬 처리 멀티코어에서 빠름 함수형 프로그래밍 프로그램을 순수한 함수의 모음으로 바라보고 구현한다. 특정한 데이터에 의존하지 않는다. ⇒ 순수 함수 람다식 특징 검증이 쉽다 성능 최적화가 쉽다 input에 대한 output을 재사용할 수 있음 ⇒ 캐싱 동시성 문제 해결이 쉽다 함수는 다른 값의 변경을 야기하지 않음 함...
기본 적인 커밋 메시지 구조는 제목,본문,꼬리말 세가지 파트로 나뉨각 파트는 빈줄을 두어 구분타입은 태그와 제목으로 구성태그는 영어로 쓰되 첫 문자는 대문자로 작성태그 : 제목의 형태이며, :뒤에만 space가 있음에 유의한다.feat : 새로운 기능 추가fix : 버
이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것을 목표로 둠크고, 제대로 조직되지 않은 테이블들과 관계들을 작고 잘 조직된 테이블과 관계들로 나누는 것을 포함하나의 테이블에서의 데이터의 삽입, 삭제, 변경이 정의된 관계들로 인하여 데이터베이스의 나머지
리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완전히 사용자 정의된 워크플로에서 작업을 결합할 수 있다.Github에서 프로젝트의 workflow 파일을 읽어
백엔드도 프론트엔드를 알고있어야 하는 것 같다.그래서 React를 공부하려고 했으나, 쉽고 빠르게 배울 수 있는 프론트 기술인 Svelte를 알게 되어서 찍먹하게 되었다.스벨트는 컴파일러라고도 불린다.그림과 같이, .svlete 파일을 html 요소로 변환해주기 때문V
서문 자바로 팀 프로젝트를 진행하는 시간을 갖게 되었고, 성공적으로 마무리를 지을 수 있었다. 이러한 경험을 토대로 KPT 회고를 작성하려 한다. KPT 회고란 Keep, Problem, Try의 약자로 회고 방법 중 하나라고 한다. Keep은 좋았거나 계속 이어갔
IP네트워크에서 자신의 위치를 나타내는 식별자브라우저컨텐츠를 송수신하고 표현해주는 소프트웨어OSI 7계층을 거쳐 데이터를 표현해주는 응용 프로그램DNS(Domain Name System)호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 그 반대의 변환을 수행하는
웹 프로젝트를 개발하다보면, HTTP의 메소드를 사용하게 되는데 주로 GET, POST, PUT, DELETE를 많이 사용해왔었다.그러나, 멱등성이라는 개념과 또 다른 메소드인 PATCH를 새로 알게 되었다. 이를 통해, HTTP의 여러 메소드를 다시 알아보고 멱등성에
여태까지 요청 데이터를 매핑하는 방법으로 RequestBody를 주로 사용해왔다. 아무래도 프론트와 통신할 때 JSON을 많이 사용하기 때문이다.그러다 RequestParam과 ModelAttribute에 대해 알아보는 시간을 가졌는데, 무슨 차이인지 정확히 기억이 안
JPA에 의해 관리되는 객체DB의 테이블과 매핑됨엔티티 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간엔티티 객체들을 조작하기 위한 객체이를 통해서 엔티티 객체를 접근하거나 조작할 수 있음EntityManager를 관리하는 객체/resources/META-INF/p
간단한 프로젝트를 진행하던 도중, 예외 처리를 적용하는 시간을 갖게 되었다.이론적으로는 많이 들어봤지만, 실제로 코딩해보거나 적용시킨 적은 별로 없었던 것 같다.커스텀 예외를 직접 생성해서 적용하는 부분에 대해 정리해보는 시간을 가져보려고 한다.컨트롤러 계층에서 예외를
Spring Data JPA는 JpaRepository 인터페이스를 구현하는 클래스를 자동으로 생성해준다.그것이 SimpleJpaRepository이다. 이를 만들어서 Bean으로 등록시킨다.메소드 이름으로 쿼리를 작성할 수 있는 기능이 존재반환값으로 Optional을
스프링의 필터를 공부하던 도중, servletRequest.setAttribute("key", "value") 형식의 코드를 볼 수 있었다. 해당 데이터가 HTTP 요청의 Header에 저장되는 코드라고 생각했지만, 뭔가 이상했다. 그 이유는 해당 객체에 setHead
Spring Security와 JWT에 대해 학습하던 도중, 의문점이 생기게 되었다. 인증 필터를 따로 만든 클래스에서, 다음과 같은 메소드를 볼 수 있었다. 여기서 의문인 부분은 바로 SecurityContextHolder.setContext(context) 이거였
서버로 요청을 보낼 수 있도록 만들어진 클래스스프링에선 Jackson 라이브러리를 사용하기 때문, 클래스 정보를 같이 넘겨주면 필드값을 매핑해줌RequestEntity 를 사용하여 설정된 값에 따른 요청을 보냄메소드, 헤더 등의 정보를 RequestEntity 에서 설
DB Table 간에는 방향이란 개념이 없음Entity간에는 방향이 존재함단방향, 양방향엔티티에서는 필드에 해당되지 않는 객체가 없으면 참조하질 못함엔티티에선 외래 키의 주인은 일반적으로 다의 관계인 엔티티이다.1대1 관계에선 키의 주인을 직접 지정해야 한다.@OneT
서버는 때때로 사용자로부터 요청을 받을 때마다 사용자의 정보를 확인할 필요가 있다.JWT를 이용한다고 가정했을 때, 클라이언트는 요청 헤더에 JWT 값을 Authorization에 넣어서 서버로 보낸다.서버는 그럼 매번 요청을 받을 때마다 컨트롤러단에서 헤더에 존재하는
JPA 에서는 연관관계에서 필요한 엔티티만 가져올 수 있는 FetchType 기능을 제공함@ManyToOne 은 기본 전략이 즉시 로딩이다.(EAGER)즉시 연관 엔티티를 가져온다.@OneToMany 은 기본 전략이 지연 로딩이다.(LAZY)연관 엔티티가 사용될 때 가
JPA를 사용할 때, Lombok에서 제공해주는 어노테이션을 아무 생각없이 사용해왔다.기본 생성자와 getter를 자동으로 생성해준다는데 이를 안쓸 이유가 없었다.하지만, Lombok에서 제공하는 다양한 어노테이션을 JPA에서 함부로 남용해버리면 문제가 일어날 수도 있
프로젝트를 진행하던 도중, 예외 처리를 해야되는 부분이 있었다.컨트롤러단에서 BindingResult를 사용해 View로 예외 내용을 전달하는 방식을 배웠지만, 지금 진행되는 프로젝트에는 따로 View가 없다. 즉, REST API 형식이다.그렇다면, 이러한 상황에서는
뉴스피드 프로젝트를 진행하게 되면서 ERD를 그리게 되었다.최대한 데이터가 서로 중복되지 않게 구성했지만, 한가지 걸리는 문제가 있었다.그것은 바로 게시글을 조회할 시, 좋아요 개수를 가져오는 것이다.인터넷 검색을 해보니, 이러한 문제를 겪는 여러 프로젝트가 있음을 확
깃으로 팀원들과 협업을 하던 도중, develop에 새로운 커밋이 올라와서 pull을 받을려면, 기존에 하던 작업을 commit하여 merge를 해왔다. 하지만, commit은 기능을 완전히 구현했을 때만 하기로 했는데, merge를 하려면 미완성인 상태에서도 com
프로젝트를 진행하던 도중, 프로필 사진을 업로드하는 기능을 구현하게 되었다.사진은 AWS의 S3에 저장시켜야 한다.스프링부트에서 S3에 사진을 업로드하고 저장된 사진의 URI를 가져오며 삭제까지 구현해보는 시간을 가져본다.S3 버킷을 public으로 생성한 뒤, 다음과
https://github.com/phdljr/news-jin스프링으로 팀 프로젝트를 진행하는 시간을 갖게 되었고, 성공적으로 마무리를 지을 수 있었다. 이러한 경험을 토대로 KPT 회고를 작성하려 한다.KPT 회고란 Keep, Problem, Try의 약자로
커스텀 예외를 처리하는 방법 중, ControllerAdvice를 통해 예외를 처리하는 방법을 알게돼서 프로젝트에 적용해보았다.하지만, 예상보다 만들어지는 커스텀 예외의 수는 많았고, 만들어질 때마다 제목만 다르고 내용은 거의 비슷한, 즉 중복 코드가 많아지는 현상이
스프링 MVC 프로젝트를 다루다보면, 흔히 사용되는 패키지 구조가 있다.이처럼, 비슷한 성격을 가진 클래스들끼리 모아두는 구조가 흔히 사용되는 방식이다.규모가 작거나 간단한 프로젝트인 경우는 별다른 무리가 없었지만, 규모가 커질수록 클래스들끼리 얽히는 상황이 종종 발생
팀원들과 JPA의 영속성 컨텍스트에 대해 얘기를 나누던 도중, OSIV를 듣게 되었다.연관 관계에서 fetch가 Lazy로 설정돼 있다면, 해당 메소드에서 연관 관계 엔티티를 조회할 시 트랜잭션 환경에서 진행되야 하는 것으로 알고 있다.그 이유는, 영속성 컨텍스트를 통
테스트 코드에 대해 공부하던 도중, Jacoco를 알게 되었다.이에 대해 알아보고 사용해보는 시간을 가져본다.소프트 웨어의 테스트를 논할 때 얼마나 테스트가 충분한가를 나타내는 지표중 하나테스트를 진행했을 때 코드 자체가 얼마나 실행되었냐는 것을 측정Java를 위한 무
테스트를 진행하던 도중, 엔티티 더미 데이터를 생성할 필요가 생겼다.그러나, 이를 생성하는것도 일이었다.그러던 도중, 데이터 생성에 도움을 주는 FixtureMonkey를 알게 되었고, 간단하게 사용해보는 시간을 가져보았다.예시 코드를 통해 사용하는 방법을 간접적으로
테스트 코드를 작성하며 기능을 검증하던 도중, 예상치 못한 오류를 발견하게 되었다. 다음과 같이 엔티티가 있다고 가정한다. User 엔티티는 양방향으로 Review를 여러 개 가질 수 있다. 테스트할 기능은 다음과 같다. 해당 기능은 조회한 사용자의 리뷰 목록을 조
https://github.com/phdljr/spring_dp_out스프링으로 팀 프로젝트를 진행하는 시간을 갖게 되었고, 성공적으로 마무리를 지을 수 있었다. 이러한 경험을 토대로 KPT 회고를 작성하려 한다.KPT 회고란 Keep, Problem, Try
스프링 프로젝트를 진행하다보면, 계층 간의 데이터를 전달하는데에 DTO를 많이 사용한다. 때로는 VO를 쓰기도 한다.해당되는 데이터를 DTO로 만들어 줄 때, 주로 생성자나 Builder, 또는 따로 만들어둔 메소드를 통해 만들게 된다.그러나, 서비스가 많아지게 된다면
인터넷을 검색하던 도중, DTO를 쓰는 이유와 작성 방법에 대해 설명하는 글이 있어서 읽어보게 되었다.거기서 DTO를 class로 생성하지 말고, record로 만들면 좋다는 내용이 있었다.DTO가 무엇인지 다시 생각해보며, record와 잘 맞는 이유에 대해
Redis나 JavaMailSender를 사용해봤다면, 설정 값들을 application파일에 선언해둔 적이 있을 것이다. 외부 파일에 설정해둔 값들을 스프링에서 읽으려면 @Value 를 통해 읽어왔었다. 하지만, 이는 하나의 속성값만 읽어올 수 있어서 번거로움이
팀 프로젝트를 진행하면서, Github에서 제공되는 서비스인 Projects를 사용해보려고 한다. Trello를 연상하게 되는 칸반 보드를 제공하면서도, Issues나 PR 등 Github에서 제공하는 다른 서비스와 연결해서 사용할 수 있어서 편리해 보였다. 이를 간단하게 소개해보는 시간을 가져본다. Github Projects GitHub에서 작업을...
orphanRemoval=true와 CascadeType.PERSIST를 같이 써야 한다.
스프링으로 팀 프로젝트를 진행하는 시간을 갖게 되었고, 성공적으로 마무리를 지을 수 있었다. 이러한 경험을 토대로 KPT 회고를 작성하려 한다.KPT 회고란 Keep, Problem, Try의 약자로 회고 방법 중 하나라고 한다.Keep은 좋았거나 계속 이어갔으면 하는
딸깍! 레시피누구나 레시피를 등록할 수 있고, 누구나 그 레시피로 요리를 할 수 있습니다.레시피의 재료가 딸깍! 한번으로 결제가 가능합니다.제목: 딸깍! 레시피설명요리 레시피에 사용되는 재료를 한번에 주문하는 서비스직접 레시피를 작성하고 공유요리 순서, 재료 양, 조리
시스템을 설계하기 위해, 팀원들과 와이어프레임과 ERD를 만들게 되었다.와이어프레임을 통해 실제 프론트의 화면 구성과 데이터의 이동 상황을 파악할 수 있었고,ERD를 통해 데이터의 연관 관계를 파악할 수 있었다.이러한 과정에 대해 공유해보는 시간을 가져보겠다.웹사이트의
최종 프로젝트에서 프론트 기술을 무엇을 써야될 지에 대해 의논해보는 시간을 갖게 되었다.원래는 React로 진행해보려 했으나, 학습 난이도가 있는 편이라 간단하게 배워서 사용하기엔 무리가 있어 보였다.그렇기에, React보다 쉽고 빠르게 학습해서 적용시킬 수 있는 기술
최종 프로젝트를 진행하면서, 팀원들과 Github에서 제공해주는 Issues와 Projects를 사용하게 되었다. 어떻게 적용됐고 사용되는지 간략하게 알아보는 시간을 가져본다. Github Issues 기능 추가 및 버그 발생, 아이디어 제안 등 프로젝트에 관련된 내용을 적는 공간 이슈를 생성하여, 관련된 PR과 연결할 수도 있다. Github Pr...
최종 프로젝트를 진행하던 도중, @EntityGraph에 대해 조사를 하게 되었는데, 테스트를 하던 도중 EAGER와 LAZY에 대해 다시 알아보는 시간을 갖게 되었다. LAZY와 EAGER에 대해 발생되는 쿼리 개수가 다를 줄 알았는데, 알고보니 같았다. 그 이유
프론트와 백엔드를 연결하는 과정에서, CORS를 설정해줄 필요가 있었다.CORS가 무엇인지, 어떠한 원리인지, 결국 서버는 어떻게 설정해줘야 하는지에 대해 간략하게 알아보는 시간을 가져보겠다.동일 출처 정책한 출처에서 로드된 문서 또는 스크립트가 다른 출처의 리소스와
쿼리 개수는 동일하며, EAGER는 되도록 join을 사용하려고 노력한다. 이 둘의 가장 큰 차이점은, 언제 쿼리를 날리냐는 것이다.
@Transactional 때문에 성능 차이가 존재한다.
최종 프로젝트를 진행하던 도중, 부모 엔티티와 자식 엔티티를 동시에 저장해야되는 상황이 있었다.이를 해결하기 위해서 부모 엔티티를 먼저 저장한 뒤, 자식 엔티티를 저장하는 형태로 진행하려고 했다.그러나, 생각해보니 JPA에서 제공해주는 좋은 기능이 있다는 것을 알게 되
프론트에서 이미지와 DTO를 백엔드로 보내줄 필요가 있었다.단순히 body에 담아서 다 보내주면 될거라는 막연한 생각을 했지만, 어림도 없었다.여러 시행착오를 겪으며 해결책을 찾게 되었으며, 이에 대해 글을 작성해보는 시간을 가져보겠다.HTTP 요청에서 리소스의 미디어
프로젝트를 진행하던 도중, 프론트와 백엔드를 구축하고 배포한 뒤, 테스트를 진행하던 도중 다음과 같은 오류를 직면하게 되었다. 이것이 무엇이며, 어떻게 해결했는지에 대해 설명해보는 시간을 가져보겠다. 상황 프론트 서버는 Netlify 플랫폼을 통해 배포된 상태
최종 프로젝트에서 백엔드 서버의 CI/CD를 SSH로 간단하게 구축했었다. 그러나, 가끔 scp나 ssh 명령어에서 오류가 뜨는 현상을 종종 직면하게 됐다. 조언을 들어본 바, scp나 ssh로 파일을 전송하거나 작업을 할 때, 메모리 부족 현상으로 위와 같은 오류가
프론트 서버와 백엔드 서버가 HTTPS와 HTTP를 같이 사용해서 오류가 발생한 적이 있었다. 이를 해결해주기 위해서, 백엔드 서버에도 HTTPS를 적용시키려고 한다. 이러한 과정에 대한 내용을 정리해보는 시간을 가져보겠다. 순서 Route 53에서 도메인 구매
Svelte를 배포할 수 있는 플랫폼을 찾다가, Netlify를 알게 되었다.Netlify 말고도, Vercel이나 S3, Github Pages를 통해서 배포할 수도 있지만, 기본적으로 CI/CD를 제공해주며 설정하기 편한 환경을 제공해주는 플랫폼을 선택하게 되었다.
최종 프로젝트가 끝나고, 약 2주의 시간이 흘러 이제서야 회고록을 작성하게 되었다.약 5주간 최종 프로젝트를 진행하게 되었으며, 기획부터 설계, 구현 등 모든 과정을 팀원들과 함께 진행해왔다. 이러한 과정속에서 팀원들과 함께 수많은 우여곡절을 겪으며 함께 헤쳐 나갔었다
저번에 라즈베리파이 5가 출시됐다는 소식을 접하게 됐었다.이전 버전과는 달리 CPU 사양이 눈에 띄게 업그레이드된 모습을 볼 수 있었고 전원 버튼(드디어!) , 실시간 시계, PCIe 2.0x1 인터페이스가 추가된 모습을 볼 수 있었다.당장 사고싶다는 충동 구매를 느꼈
보통 Java 개발을 하다보면 상수 인스턴스를 enum으로 구현해서 사용하는 경우가 많다.이러한 용도 말고도 어떻게 enum을 활용할 수 있는지 알아보는 시간을 가져보겠다.상수 그룹을 나타내는 특수 클래스클래스지만 런타임시 미리 정해진 인스턴스로만 구성된 집합체런타임시
Java에 대해 더 알고싶다면 여기로..
JWT Refresh Token에 대해 공부를 하던 도중, 어느 부분에서 doFilter를 호출하는 것이 아닌, return을 호출하게 됐다.필터는 무조건 FilterChainFilter에 대해서 잠깐 알아보고, return과 doFilter()\`의 차이점에 대해 알
다른 웹 서비스를 이용해 시스템을 개발하는 경우가 많아지고 있다. 그 중에서도, 이벤트 기반