분류 전체보기 55

클린 아키텍처(Clean Architecture)

클린 아키텍처를 알아보기 전에, 레이어드 아키텍처의 문제점에 대해 짚고 넘어가도록 하겠다.레이어드 아키텍처는 크게 도메인 패키지, 서비스 패키지, 웹 패키지로 구성되어있다.웹 패키지가 서비스 패키지에 의존하고, 서비스 패키지가 도메인 패키지에 의존하고 도메인 패키지는 영속성(JPA)에 의존하게 되는 구조이다. 여기서 레이어드 아키텍처의 문제점은, 영속성 레이어가 기반이 된다는 것이다. 이게 무슨 말이냐면 DB 구조나 세부사항이 도메인, 서비스, 웹 통틀어서 영향을 줄 수 있다는 것이다.레이어드 아키텍처의 JPA Entity 클래스를 보면 영속성 레이어의 세부사항이 많이 노출되어있다. 기본적으로, @Entity, @Column, @GeneratedValue 등 jakarta.persistence의 어노테이..

Architecture 2024.08.12

계층형 아키텍처(Layered Architecture)

아키텍처란?IEEE 국제 표준에서는 소프트웨어 아키텍처의 정의를 다음과 같이 설명한다.구성요소들간의 관계, 환경, 설계와 발전을 관리하는 원칙으로 이루어진 시스템의 근본적인 구조클래스, 파일, 컴포넌트, 모듈 등 코드들이 어떻게 연관되어있고, 상호작용하는지 설계하는 것이다.소프트웨어 아키텍처의 목표는 소프트웨어의 제작과 유지보수를 보다 쉽게 하는 것, 즉 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소화하는 것이다.  아키텍처의 구성소프트웨어는 크게 도메인과 인프라스트럭처로 나누어져있다. 도메인이란 소프트웨어로 해결하고자 하는 문제 영역을 말하고(번역앱이라면 번역, 온라인 쇼핑몰이라면 판매 프로세스가 도메인) 도메인은 서비스의 본질로, 자주 바뀌지 않는다. 인프라스트럭처는 도메인을 소프트웨어..

Architecture 2024.08.05

Uncaught TypeError: Illegal invocation

ajax에서 API로 Multipart 파일을 보내려는 중 발생한 오류이다. 아래는 문제의 내 코드이다.$.ajax({ url: '/api/exampleApi', // API 엔드포인트 URL type: 'POST', // 요청 방식 (GET, POST 등) data: formData, // 전송할 데이터 contentType: false, // 전송할 데이터 타입 dataType: false, success: function(response) { // 요청이 성공했을 때 실행할 코드 console.log('Success:', response); }, error: function(jqXHR, textStatus, errorThrown) ..

Trouble Shooting 2024.07.02

Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.io.File` from Object value (token `JsonToken.START_OBJECT`) 오류 해결

js에서 ajax로 api를 호출할 때 json 형식으로 보내고자 했다. 그러나 api 호출 시 오류가 발생하였다.Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type java.io.File from Object value (token JsonToken.START_OBJECT)무언가 직렬화할 때 나는 문제인것같았다.아래는 내 코드이다.const config = files[0];const param = { name: $("#nameVal option:selected").text(), config: config, ra..

Trouble Shooting 2024.07.02

스프링에서의 WebSocket 설정과 SockJS

WebSocketws프로토콜을 기반으로 클라이언트와 서버 사이에 지속적인 완전 양방향 연결 스트림을 만들어주는 기술이다. 사전 지식폴링(Polling)>- 단방향- 클라이언트 -> 서버- 클라이언트에서 주기적으로 서버에 업데이트 있는지 확인하는 요청을 보냄 서버센트 이벤트(SSE; Server Sent Event)>- 단방향- 서버 -> 클라이언트- 한 번 연결하면 서버가 클라이언트에 지속적으로 데이터를 보냄- 클라이언트에서 서버로 데이터를 보낼 수 없음 웹 소켓(WebSocket)>- 양방향- 서버 클라이언트- 한 번 웹 소켓이 연결되면 계속 연결된 상태로 있어서 따로 업데이트가 있는지 요청을 보낼 필요가 없음- node의 모듈 및 라이브러리: ws, Socket.IO WebSocket 객체 생성하기..

Web 2024.06.18

JPQL - Criteria 기초 (조회, 집합, 정렬)

Criteria 쿼리는 JPQL을 자바 코드로 작성하도록 도와주는 빌더 클래스 API이다. Criteria를 사용하면 문자가 아닌 코드로 JPQL을 작성하므로 문법 오류를 컴파일 단계에서 잡을 수 있고 문자 기반의 JPQL보다 동적 쿼리를 안전하게 생성할 수 있는 장점이 있다.   Criteria 기초Criteria API는 javax.persistence.criteria 패키지에 있다. 아래는 단순한 Criteria 쿼리이다.//JPQL: select m from Member mCriteriaBuilder cb = em.getCriteriaBuilder(); // 1. Criteria 쿼리 빌더// 2. Criteria 생성, 반환 타입 지정CriteriaQuery cq = cb.createQuery(..

JPA 2024.05.28

indexOf(), substring() 알고리즘

간단한 문장 속 단어 알고리즘을 풀어보겠습니다.문장 속 가장 긴 단어를 출력하는 프로그램이고, 가장 길이가 긴 단어가 여러개일 경우 문장 속에서 가장 앞쪽에 위치한 단어를 답으로 합니다. 각 단어는 공백으로 구분됩니다. 입력 예시it is time to go 출력 예시time  package com.example.testproject;import java.util.Scanner;class Main{ public String solution(String str){ String answer = ""; int m = Integer.MIN_VALUE, pos; //가장 작은 값으로 초기화 /* 1. split을 쓰는 방법 String[] s = str.split(" ")..

JAVA 2024.05.20

알고리즘 - 문자열

문자열에서 특정 문자의 갯수를 구하는 간단한 알고리즘을 구현 해보겠다.package com.example.testproject;import java.util.Scanner;class Main{ public int solution(String str, char c){ int answer=0; str = str.toUpperCase(); c = Character.toUpperCase(c); for(int i=0; i for문은 둘 중 아무거나 사용해도된다. 주석으로 되어있는 for문은 향상된 for문이다. 결과는 아래와 같다.  ※ 정리 ※String, Char 의 차이→ String은 문자열이고 Char은 문자(한글자)이다.static 메소드는 인스턴..

JAVA 2024.05.20

JPQL - Named 쿼리 - 정적 쿼리

JPQL 쿼리는 크게 정적 쿼리와 동적 쿼리로 나눌 수 있다.- 동적 쿼리: em.createQuery(“select…”) 처럼 jpql을 문자로 완성해서 직접 넘기는 것. 런타임에 특정 조건에 따라 jpql을 동적으로 구성할 수 있다.- 정적 쿼리: 미리 정의한 쿼리에 이름을 부여해서 필요할 때 사용할 수 있는데 이것을 Named 쿼리라 한다. Named 쿼리는 한 번 정의하면 변경할 수 없는 정적인 쿼리다.Named 쿼리는 애플리케이션 로딩 시점에 JPQL 문법을 체크하고 미리 파싱해둔다. 따라서 오류를 빨리 확인할 수 있고, 사용하는 시점에는 파싱된 결과를 재사용하므로 성능상 이점도 있다. 그리고 Named 쿼리는 변하지 않는 정적 SQL이 생성되므로 데이터베이스의 조회 성능 최적화에도 도움이 된다..

JPA 2024.05.14