Spring 28

Spring Boot 비동기 처리(@Async)로 성능 향상 원리와 동기/비동기

1. 코드 작동 방식 이 코드는 이미지 다운로드 및 변환 작업을 비동기적으로 실행하는 역할을 합니다. 🔹 실행 흐름1️⃣ 클라이언트가 processImage(imageUrl)을 호출2️⃣ @Async가 적용된 메서드이므로 새로운 스레드에서 실행3️⃣ 메서드 실행 후 즉시 CompletableFuture 객체를 반환 (메인 스레드 블로킹 없음)4️⃣ 백그라운드에서 downloadAndProcessImage(imageUrl) 실행5️⃣ 작업 완료 후 processedImageUrl을 반환2. 비동기 성능 향상 원리 (동기 vs. 비동기)구분 동기 처리 (Synchronous) 비동기 처리 (Asynchronous)실행 방식하나의 작업이 끝날 때까지 대기여러 작업을 동시에 실행스레드단일 스레드에서 순차 실행..

Spring 2025.02.19

프로젝트 : CDN과 24년 선거 대비 자체 이미지 서버 개발 및 최적화

CDN(Content Delivery Network) 적용 및 운영 경험CDN은 전 세계 여러 지역에 분산된 엣지 서버(Edge Server)를 통해 사용자에게 정적 및 동적 컨텐츠를 빠르고 안정적으로 전달하는 기술입니다. 대규모 트래픽을 효율적으로 분산하고, 웹사이트의 로딩 속도를 단축하며, 서버 부하를 줄이는 데 중요한 역할을 합니다. 프로젝트 배경24년 선거 기간 중 Kakao, RCS, MMS 메시지 대량 발송 시 서버 다운 및 전송 속도 저하 문제 발생 가능성기존 메시지 서버에서 이미지 트래픽이 혼합되어 처리되면서 부하 급증트래픽 폭증에도 안정적으로 이미지 전송을 처리할 수 있는 독립적인 이미지 서버 필요 ✅ 주요 개발 내용자체 이미지 서버 설계 및 구축메시지 본문과 이미지 트래픽을 분리하여 전..

구글 애널리틱스 활용 웹 개발 적용

구글 애널리틱스란?구글 애널리틱스는 웹사이트의 트래픽과 사용자 행동을 분석할 수 있는 무료 웹 분석 도구입니다. 웹사이트에 방문하는 사용자들의 행동, 유입 경로, 체류 시간 등 다양한 데이터를 수집하고 분석할 수 있습니다. 주요 기능과 특징1. 실시간 모니터링현재 웹사이트를 방문 중인 사용자 수사용자들이 보고 있는 페이지사용자의 지리적 위치     2. 사용자 행동 분석페이지별 방문 시간이탈률과 전환율사용자의 이동 경로 3. 트래픽 소스 분석유입 경로(검색엔진, 소셜미디어, 직접 방문 등)검색어 분석캠페인 효과 측정 왜 구글 애널리틱스인가?개발한 프로젝트는 다양한 메시징 서비스를 제공하는 플랫폼입니다. 이런 복잡한 서비스에서는 사용자들이 어떤 기능을 주로 사용하는지, 어떤 부분에서 어려움을 겪는지 파악하..

관리자 웹 마이그레이션 프로젝트 정리

프로젝트 배경 기존 18개의 서버와 9개의 DB로 나뉘어 저 있어 운영 및 관리와 보안의 위험성이 존재합니다. 또한 20년이 넘은 JSP로 만들어진 구 애플리케이션으로 느린 페이지 로딩 시간과 비효율적인 콘텐츠 관리 시스템, 비응답형 웹 디자인 및 사용자 비 친화적이기 때문에  사용자의 UI/UX 측면에서의 향상과 차 후 리셀러(유통) 활성화로 점진적 시장 점유율 확대와 콘텐츠 관리 용시성과 효율성 증가를 목표로 만들게 되었습니다.   프로젝트 개요 이 프로젝트는 문자 전문기업을 위한 관리자 웹 애플리케이션 입니다. 해당 애플리케이션은 React와 Next.js를 사용하여 프론트앤드를 개바하였으며, 백앤드는 Kotlin과 Spring Boot 를 사용하여 구축하였습니다. 이 애플리케이션은 문자 전송을 위..

Spring Security 기본(세션, 스프링시큐리티)

스프링 시큐리티란 - 인증/인가와 보안 기능을 담당하는 라이브러리 - 쉽게 풀이하면 로그인, 권한설정, 권한검사 기능 등을 제공 - 원리 : 서블릿 필터를 이용 사용자가 리퀘스트를 주면 스프링 엠브시에서 리스폰스를 줌 즉 사용자가 리퀘스트를 서블릿 컨네이너에 주고 서블릿 컨네이너 즉 톰켓과 같은 것이 리스폰스해준다. 다시 서블릿 컨네이너에서 스프링 DispatcherServlet 에 요청하면 컨네이터네 리스폰스 해준다. 서블릿 컨네이너에서 리스폰스 리퀘스트간 스프링 디스패치 사이에 필터로 시큐리티를 구현 바로 필터를 구현하면 스프링 빈을 인식하지 못하므로, 스프링에게 구현을 위임한다. 스프링 시큐리티 bean은 필터들로 구성되어 있고, 이 필터들의 모음을 securityfilterchain이라고 부른다...

Spring 2023.03.13

Spring WatchaPedia 클론코딩 프로젝트 취향 분석(선호 배우, 국가, 장르, 감상 시간)

🎬 선호배우 분석 Service public List peopleCnt(Long userIdx){ Map peopleMap = new HashMap(); List movIdxs = starRepository.findStarMovie(userIdx); List peopleList = List.of(movieRepository.findPeopleList(movIdxs).toString() .split("\\[")[1].split("]")[0].split(", ")); for(String str: peopleList){ String[] personList = str.split(","); for(String per : personList){ if(per.contains("주연")){ Long personIdx ..

Spring 클론코딩 프로젝트 취향분석( 유저정보, 평가수, 별점분포)

🎬 취향분석 유저 아이디 타임리프 입력 부분 취향분석 ㅁㄴㅇ tb_user 테이블에 있는 해당 로그인한 정보를 출력하는 부분이다. 🎬 취향분석 유저 평가수 타임리프 부분 37 영화 21 TV 프로그램 11 책 20 웹툰 해당 콘텐츠에 대한 별점의 수를 합처 출력하는 부분이다. 🎬 취향분석 유저 평가 별점 분포 타임리프 부분 대중의 평가에 잘 휘둘리지 않는 '지조파' 해당 사용자가 준 별점의 평가를 기준으로 사용자의 성향을 글로 표현하였다. 기존 왓챠피디아는 20여개 이상의 별점 성향이 존재하지만 클론코딩간 많은 데이터가 존재하지 않고 동일한 기능의 반복이기 때문에 '독수리파'와 같이 특정 3개의 성향을 표출하였다. 그래프 표현 방식은 기존 DetailPage의 그래프 방식과 유사하다. 🎬 취향분석 유저 ..

Spring 클론코딩 프로젝트 콘텐츠 DetailPage( 비슷한 장르의 작품 추천)

🎬 MovieRespose - Containing 이용하여 유사 장르 뽑기 List findByMovGenreContaining(String genre); 🎬 MovieService @Transactional(readOnly = true) public List similarGenre(String genre, Long movieIdx){ List result = new ArrayList(); List movieIdxList = new ArrayList(16); if(genre.contains("/")){ List genreList = Arrays.stream(genre.split("/")).toList(); HashMap containMovie = new HashMap(); for(String idx: g..

Spring 클론코딩 프로젝트 콘텐츠 DetailPage( 감상 가능한 곳, 유튜브(youtube) 예고편, 겔러리)

🎬 감상가능한 곳 타임리프 tb_movie 테이블의 mov_watch 컬럼에서 해당 movieIdx 값을 통해 해당하는 링크와 이미지 이름을 주기위해 타임리프에서 splt과 삼항연산자를 이용하여 구현하였다. th:title="${#strings.contains(wat,'aHR0cHM6Ly93d3cubmV0ZmxpeC5jb20vdGl0b')} or ${#strings.contains(wat,'netflix')}? '넷플릭스' : 1. {#strings.contains(wat,'aHR0cHM6Ly93d3cubmV0ZmxpeC5jb20vdGl0b' 이 부분은 넷플릭스의 고유 주소 값이다. 2. netflix 가 포함되어도 넷플릭스인걸 알 수 있기 때문에 타임리프에서 or 조건을 사용해서 1번과 2번이 포함되면..

Spring 클론코딩 프로젝트 콘텐츠 DetailPage( 출연/제작)

✔ 출연/제작 - Controller 부분 // 인물 리스트 List peopleList = new ArrayList(); List people = new ArrayList(); List personList = new ArrayList(); if(movie.people() != null){ peopleList = List.of(movie.people().split(",")); for(String per : peopleList){ people.add(per.split("\\(")[0] + "," + per.split("\\(")[1].split("\\)")[0]); } } try{ personList = personService.personList(people); }catch (Exception e){ S..

Spring 클론코딩 프로젝트 콘텐츠 DetailPage(별점,별점 그래프, 해당 유저 별점 달았는지)

✔ MovieController - @RequesdtMapping("/movie") 기본 주소 @Controller @RequestMapping("/movie") @RequiredArgsConstructor ✔ @GetMapping("/{movieIdx}") // http://localhost:8080/movie/1 @GetMapping("/{movieIdx}") // http://localhost:8080/movie/1 public String movieDetail( @PathVariable Long movieIdx, @PageableDefault(size = 5, sort = "commIdx", direction = Sort.Direction.DESC) Pageable pageable, ModelMa..

Spring 프로젝트 별점 순 출력

/* 별점 높은순 출력, 어느정도 인원이 평가해야(타임리프 적용) 0명이 평가한 경우 한명이 바로 5점을 주면 1등이 나오기 때문*/ @Transactional(readOnly = true) public List movieStar() { //평균 구하기 List result = new ArrayList(); // 평균점수가 최소 4.2 이상인 : 설정을 안할 경우 데이터가 없을경우 1점도 들어갈 수 있음 List result2 = new ArrayList(); // 평가한 인원이 최소 5명인 : 평가자가 0명인 경우 처음 평가한 이가 5점을 주면 바로 최고 점수 List result3 = new ArrayList(); List movieStar = movieRepository.findAll(); for(..

Spring 클론코딩 프로젝트 MovieController 랜덤출력

✔ 사전 준비(MovieService) // 나라&장르 랜덤출력 하기위한 부분 @Transactional(readOnly = true) public List searchCri(String genre, String country) { //빈 웹툰리스폰스 리스트 List result = new ArrayList(); List result2 = new ArrayList(10); List movieList2 = movieRepository.findByMovGenreContainingAndMovCountryContaining(genre, country); for(Movie m : movieList2){ double sum = 0; int starCount = 0; for(Star star : m.getStar()..

Spring 시험 (7번), Thymleaf 이용 리스트 출력

영화 테이블을 만들어라 (영화번호, 제목, 국가, 장르, 개봉일, 런닝타임) 더미 데이터의 수는 상관 없다. 이를 어떠한 방식으로든 리스트로 출력해라 ✔ 영화 테이블 생성 (Entity) - sql 을 만들지 않고 @Table 을 이용하여 컬럼(제목, 국가, 장르, 런닝타임) 선언 package com.koreait.task7.domain; import lombok.Getter; import lombok.Setter; import lombok.ToString; import net.bytebuddy.asm.Advice; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedD..

Spring 2023.01.09

Spring Project Board 2 (Repository, DTO, PageController) - 타임리프 SQL 출력

MockMvc 웹 어플리케이션을 어플리케이션 서버에 배포하지 않고 테스트용 MVC 환경을 만들어 요청 및 전송, 응답기능을 제공하는 유틸리티 클래스 Query DSL - JPA를 좀 더 효율적으로 사용할 수 있는 라이브러리 - 오픈소스 프로젝트로 JPQL을 Java 코드로 작성할 수 있도록 함 - 정적 타입을 이용해서 SQL과 같은 쿼리를 생성해줌 @ConfigurationPropertiesScan - @EnableConfigurationProperties를 이용해 설정 프로퍼티 클래스를 사용하는 경우 클래스가 많아지면 코드가 무거워지고 복잡해짐 ✔ Repository @RepositoryRestResource//내가 설정한 REST 기능을 부여함(기본적인 API 자동 생성) public interfac..

Spring 2023.01.08

Spring Project Board(게시판) 1

✔ 게시판 프로젝트 게시판 프로젝트 개발환경 - 개발도구 : 인텔리제이 - 소스코드 관리 : Git - Git 호스팅 : GitHub - Git GUI : 깃크라켄 (https://www.gitkraken.com/) - SDK : JDK 17 목표 - 누구나 사용하기 쉽게 명확한 기능의 요구사항을 만듬 - 요규사항을 구현하는데 도움이 되는 각종 문서 작업을 경험 - 자바 + 스프링부트로 요규사항을 실제로 구현하는 기술적인 방법을 습득 - 최신 버전의 기술을 사용하면서 기술 동향을 파악하고 새로운 기술들을 익혀봄 - 기획과 문서 작성부터 개발, 형상관리, 테스트. 배포까지 개발 프로세스 전반을 경험 문서작업 https://www.diagrams.net/ (draw.io) : 도메인과 ERD 설계 구글 시트..

Spring 2023.01.02

Spring 유용한 Setting, 사이트

✔ Intellij 유용한 세팅 - File -> Settings -> Plugin -> 검색 1. Atom Material Icons Intellij 파일을 가시성을 높여주는 Plugins 2. One Dark theme 코드의 색을 바꿔 가시성을 높여주는 기능 3. Grep Console 콘솔창 내 많은 코드가 있는 경우 콘솔창 의 가시겅을 높여주는 기능 ✔ 유용한 사이트(mookaroo) CSV, SQL, JSON, XML 등 다양한 더미 데이터를 손쉽게 만들어 주는 사이트 https://www.mockaroo.com/schemas/new Mockaroo - Random Data Generator and API Mocking Tool | JSON / CSV / SQL / Excel www.mocka..

Spring 2022.12.29

Spring 타임리프 이용 기본

✔ 템플릿 엔진 템플릿 엔진 - 지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어 - 서버 템플릿 엔진 - velocity : 과거 스프링에서 많이 사용하던 엔진. 현재 권장하지 않음 - freemarker : 템플릿 엔진으로 많은 기능을 지원. Apache 템플릿 엔진으로 템플릿 및 변경 데이터를 기반으로 텍스트, 메일, 파일등을 생성하는 Java 라이브러리를 제공 - thymeleaf : 스프링 부트에서 적극 지원하고 있는 엔진. 문법이 쉽지 않음. react, vue의 경험이 있다면 최적의 템플릿 엔진 - mustaches : 문법이 다른 템플릿 엔진보다 쉽다. 비즈니스 로직을 사용할 수 없음. view의 역할과 서버의 역할이 명확하게 구분됨 타임리프(Thymeleaf) 타임..

Spring 2022.12.19

Spring Main Page Project

✔ UserApiRequest : 클라이언트가 서버쪽으로 요청할 정보를 전달해주는 부분 @NoArgsConstructor @AllArgsConstructor @Data @Builder public class UserApiRequest { //클라이언트가 서버쪽으로 요청할 정보를 전달해주는 부분 private String userid; private String name; private String userpw; private String hp; private String email; } ✔ UserApiResponse : 서버가 사용자에게 줄 수 있는 데이터들을 클래스화 import java.time.LocalDateTime; @Data @NoArgsConstructor @AllArgsConstructo..

Spring 2022.12.18

Spring Join

✔ Category Join @Entity // JPA를 사용해서 DB 테이블과 메핑할 클래스를 연결 @NoArgsConstructor // 파라미터가 없는 기본 생성자를 생성 @AllArgsConstructor //모든 필드 값을 파라미터로 받는 생성자를 만들어줌 @Data @Builder // 연속적으로 실행하게 해주는 기능 ex) method.method ...... @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) @EntityListeners(AuditingEntityListener.class) public class Category extends BaseEntity implements Auditable { // ctrl + sh..

Spring 2022.12.13

Spring (리스너, 연관 관계 메핑, 어노테이션)

✔ 리스너 특징 리스너(특정 이벤트를 받기 위해 대기) 이벤트 종류 //Post - `직 후` Pre = '직 전' 1. PostLoad : 엔티티가 영속성 컨텍스트에 조회된 직후 2. PrePerList : 새로운 인스턴스를 merge할 때 수행. persist() 메소드를 호출해서 엔티티를 영속성 컨텍스트에 관리하기 직전에 호출 3. PreUpdate : flush, commit를 호출해서 엔티티를 데이터베이스에 수정하기 직전에 호출 4. PreRemove : remove 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출 5. PostPersist : flush, commit를 호출해서 엔티티를 데이터베이스에 저장한 직후에 호출 6. PostUpdate : flush, commit를..

Spring 2022.12.13

Spring (Enum, Query Method 기본, Optional, @Bean)

✔ Enum Class 기본 Enum 클래스 - 열거체를 비교할 때 실제 값과 타입까지 체크할 수 있는 클래스 enum 열거체이름 { 값1, 값2, 값3 ... } 열거체이름 변수명; for(int i=0; i{ usersRepository.delete(selectUser); } ); } @Test public void login(){ //userid , hp, email Optional users = usersRepository.findByUseridAndUserpw("apple","2222"); users.ifPresent( selectUser ->{ System.out.println("userid : " +selectUser.getUserid()); System.out.println("hp : " ..

Spring 2022.12.11

Spring 데이터 관리(데이터 출력(모든), 삭제, 정렬, 검색, 저장, 불러오기, 존재 확인, 페이지 생성)

✔ 모든 데이터 출력 @Authored : 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입, 변수 및 메서드에 스프링이 관리하는 BEAN을 자동으로 매핑해준다. 🔏 모든 데이터 출력1 lic class AdminUserRepositoryTest extends Day4ApplicationTests { @Autowired // 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입 , // 변수 및 메서드에 스프링이 관리하는 Bean을 자동으로 매핑해주는 개념 private AdminUserRepository adminUserRepository; // // findById() 리터널이 optional @Test public void crud1(){// 모든 데이터 출력 adminUserRepository..

Spring 2022.12.09

Spring Added dependencies 등 간편하게 사용

✔ Maven repository 통하지 않고 인텔리제이에서 바로 Added dependencies 하는 법 file -> New Project -> Added dependencies 를 원하는 부분을 Dependencies에서 찾아 삽입해주면 된다. ✔ 결과 -> build.gradle을 보면 바로 들어간것을 볼 수 있다. 버전은 따로 없고 Spring에 맞는 적절한 내용이 들어간것을 볼 수 있다. repositories { mavenCentral() } //버전은 따로 없고 spring에 맞는 내용이 자동으로 들어간다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation '..

Spring 2022.12.08

Spring 기본 (create, update, delete)

✔ Spring 기본 Gradle - 의존성 관리의 다양한 방법을 제공하는 기술 - maven은 xml을 사용, gradle은 groovy라는 언어를 사용 - 오픈소스 빌드 도구(개발시 자동으로 빌드를 도와주는 프로그램) ORM(Object-Relational Mapping) - 객체와 관계형 DB를 매핑 - 객체를 마치 자바 컬레션에 저장할 수 있고, 적절한 SQL을 생성해서 DB객체에 저장 JPA(Java Persistence API) - 자바의 ORM 기술 표준 - 객체를 DB에 저장하고 관리할 때 개발자가 직접 SQL을 작성하지 않으도 됨 - JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고 객체를 자동으로 Mapping - 스프링 부트는 ORM 프레임워크(Hibernate)가 탑제되..

Spring 2022.12.08

Spring PostController

✔ post방식의 postController package com.koreait.day2.controller; import com.koreait.day2.model.Member; import org.springframework.web.bind.annotation.*; @RestController // rest로 호출할 수 있는 기능이다. url 호출기능이다 @RequestMapping("/api") // http://localgost:8888/api public class PostContorller { // url로 호출을하면 get방식이다. - > url 사용 // http://localhost:8888/api/postmethod @RequestMapping(method = RequestMethod.P..

Spring 2022.12.08

Spring(스프링 프로젝트 구조 , GetController) , @RestController, @RequestMapping, @RequestParam, @GetMapping

✔ 스프링 프로젝트 구조 스프링 프로젝트 구조 src > main > java : 자바 코드 src > main > resources > application.properties : 설정정보 src > main > resources > static : 정적 컨텐츠(html, css, js) src > main > resources > templates : 동적 템플릿 src > test > java : 테스트용 자바코드 작성 build.gradle : 버전 관리 테이블 정의서 (엔티티정의서) - 보통 엑셀로 작성하며 테이블 및 컬럼명과 데이터 타입등을 작성해놓은 문서 ERD(Entity Relationship Diagram) - 개체-관계 모델, 테이블간의 관계를 설명해주는 다이어그램 - DB의 구조를 ..

Spring 2022.12.08

Spring 시작(start.spring)

✔ Spring 들어가며 https://start.spring.io/ - 자바 스프링 사용 무료 🔏 실행 예) Project - Gradle - Groovy Language - Java Spring Boot - 3.0.0 OR 2.7.6 (SNAPSHOT은 테스트 버전으로 이게 없는것을 선택하자) Project Metadata Group - com.koreait(쓰고 싶은내용) Artifact - day1 Name - day1 Description - Demo project for Spring Boot Package name - com.koreait.day1 Packaging - Jar Java - 11(내가 11을 쓰고있다) File -> open -> spring -> build.gradle or 패..

Spring 2022.12.06