기술없는 기술 블로그 RSS 태그 관리 글쓰기 방명록
분류 전체보기 (18)
2022-01-18 10:10:26

@RequestParam

- 변수를 url을 통해 받음

- 1대1로 생성자의 매개변수와 전달받은 값을 바인딩함

@RequestBody

- json 데이터를 자바 객체에 맵핑함

- POST 요청 시 생성자가 있어야함, Setter 불필요

- GET 요청 시 Setter가 존재해야함

2022-01-04 00:18:08

 

SpringBoot 2.6.2를 사용하면서 Hibernate 쿼리를  MySQL 쿼리로 변환하는 아래의 config가 Deprecated 되어 에러가 발생했다.

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.mysql5innodbdialect

 

해당 문제를 구글링해본 결과 동욱님의 깃허브나 블로그에서도 확인 할 수 있었다.

 

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
spring.datasource.hikari.jdbc-url=jdbc:h2:mem://localhost/~/testdb;MODE=MYSQL

깃헙에서 설명한 코드를 적용하여 정상적으로 작동하는 것을 확인했고 해당 properties의 의미나 관련 내용에 대해서 찾아서 정리해야겠다.

 

 

 

https://github.com/jojoldu/freelec-springboot2-webservice/issues/67

 

P.100 properties 추가 시 작동 오류 · Issue #67 · jojoldu/freelec-springboot2-webservice

안녕하세요~ 조졸두님 책으로 공부하고 있는 베니라고 합니다! 100 페이지에서 application.properties에 MySQL5InnoDBDialect 추가 시 밑에 이미지와 같이 나오고 있습니다! 그리고 해당 클래스를 보면 /** A D

github.com

 

'study > java&spring' 카테고리의 다른 글

[Spring] @RequestBody @RequestParam 차이  (0) 2022.01.18
@WebMvcTest @SpringBootTest 차이  (0) 2022.01.02
[gradle] Lombok plugin 빌드 오류 해결  (0) 2021.12.31
Gradle 5의 lombok 설정  (0) 2021.12.31
Java Bean과 Spring Bean  (0) 2021.12.30
2022-01-02 23:52:01

 

@WebMvcTest( controller = temp.class )

컨트롤러를 테스트 할 때 사용하는 어노테이션

@Controller @ControllerAdvice 사용 가능

@Service @Component @Repository 어노테이션은 사용 불가

@AutoConfigureMockMvc

컨트롤러를 테스트 할 때 사용하는 어노테이션

테스트 대상이 아닌 @Service와 @Repository 객체들도 메모리에 올라감.

 

@SpringBootTest

웹어플리케이션에 필요한 모든 Context (프로젝트에 사용된 등록된 모든 Bean)를 불러와서 테스트한다.

 

 

2021-12-31 21:48:52


https://cyeongy.tistory.com/entry/Gradle-5의-lombok-설정?category=1032553

 

Gradle 5의 lombok 설정

스프링 이니셜라이저를 통해 생성한 코드, 책에서 설명한 코드를 비교해가며 직접 생성한 Gradle Project에 JUnit5, Gradle 7.0, SpringBoot 2.6.2를 설치해서 실습을 진행했다. 스프링 이니셜라이저를 통해

cyeongy.tistory.com

plugins id를 이용해서 롬복을 임포트했을 때 원인이 무엇인지 검색해보니 여러가지 단서를 얻을 수 있었다.

 

 

The 3.x versions of the lombok plugin are made for Gradle 5.x, so you either have to downgrade the lombok plugin to 2.9.5 or update Gradle to 5.3

 

https://github.com/freefair/gradle-plugins/issues/34

 

java.lang.NoSuchMethodError: org.gradle.api.tasks.SourceSet.getExtensions · Issue #34 · freefair/gradle-plugins

https://bitbucket.org/yerzhant/akka-java If you uncomment the plugin (line 5) in build.gradle and comment lombok deps (lines 21 and 22), i.e. resulting build.gradle should look like this: plugins {...

github.com

 

스프링부트 디펜던시 관리용 플러그인을 따로 설치하는 것처럼 Gradle의 버전과 Lombok의 버전이 일치하지 않아 발생한 에러였다.

 

 

최신 버전의 6.3.0 버전은 Gradle 7.3을 지원한다는 내용으로 그레들을 7.3으로 업그레이드 후 문제가 해결되었다.

 

이동욱님이 사용하시는 Gradle 4.10 버전을 사용하는 경우 2.9.5 버전을 사용하면 될 것 같다.

plugins {
	id 'io.freefair.lombok' version '2.9.5'
}

 

 

2021-12-31 21:03:40

스프링 이니셜라이저를 통해 생성한 코드, 책에서 설명한 코드를 비교해가며

직접 생성한 Gradle Project에 JUnit5, Gradle 7.0, SpringBoot 2.6.2를 설치해서 실습을 진행했다.

 

스프링 이니셜라이저를 통해 생성된 Gradle의 롬복 관련 코드는 아래와 같다.

 

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
	// ...
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    // ...
}

 

스프링 이니셜라이저에서 제공하는 의존성 설치가 안정적이긴 하지만 굳이 configurations가 필요한가 싶어 지워보았을 때 문제없이 작동 하였다. 이 부분은 아직 명확하게 찾아낸 내용이 없어 조금 더 찾아 보는 중이지만 롬복 프로젝트에서 제공한 방식과 큰 차이가 없는 것을 찾아냈다.

 

아래 코드에 적힌 롬복 프로젝트에서 추천하는 방식은  plugins를 사용한 방식으로 스프링 이니셜라이저의 방식과 조금 다르지만 내가 잘 못 설정한 탓인지 plugins 방식을 사용 했을 때 lombok을 사용하지 못했다.

 

plugins {
  id "io.freefair.lombok" version "6.3.0"
}

 

buildscript를 이용한 apply plugin 방식

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "io.freefair.gradle:lombok-plugin:6.3.0"
  }
}

apply plugin: "io.freefair.lombok"

 

만약 플러그인 방식을 사용하지 않고 mavenCentral에서 의존관계를 설치하고 싶다면 아래의 코드를 사용할 수 있다고 적혀있다.

 

repositories {
	mavenCentral()
}

dependencies {
	compileOnly 'org.projectlombok:lombok:1.18.22'
	annotationProcessor 'org.projectlombok:lombok:1.18.22'
	
	testCompileOnly 'org.projectlombok:lombok:1.18.22'
	testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
}

 

 

추가로 compileOnly 에서 implementation으로 바꿔도 문제는 없으나 lombok의 Getter, Setter는 컴파일 타임에 사용하고 런타임에는 사용하지 않기 때문에 compileOnly를 추천하는 듯 하다.

 

추가적으로 공부해야할 내용은 아래 세 가지가 생겼다.

 

1. plugins 방식의 lombok을 사용해서 빌드 했을 때 실패한 원인, 해결책

2. implementation, compileOnly, runtimeOnly, api 차이

3. configurations - CompileOnly - extendsForm 문법의 의미

 

 

 

 

 

 

https://kkambi.tistory.com/155

https://projectlombok.org/setup/gradle

https://bepoz-study-diary.tistory.com/372#recentComments

 

 

2021-12-30 20:59:47

 

 

책을 읽으면서 @Autowired @Repository 등의 어노테이션을 보면서 기존 Java bean과 차이가 무엇인지 궁금해 해당 어노테이션의 의미, 기능, 원리 등을 검색 해보면 스프링의 DI(의존성 주입)를 위해 IoC컨테이너가 관리하는 객체라고 설명하면서 여러가지 설명을 하고있다.

 

자바 빈은 private 필드, 전달 인자가 없는 생성자, getter와 setter로만 접근, 관리하는 자바 객체이고

스프링 빈은 스프링 IoC컨테이너에서 관리되는 자바 객체를 스프링 빈이라고 부른다.

 

스프링 IoC컨테이너에 자바 객체를 빈으로 등록하기 위해서는 @Bean 혹은 @Component를 사용할 수 있다.

 

@Bean과 @Component의 차이는 이동욱님의 블로그에서 확인 할 수 있었다.

 

@Bean은 메소드 레벨에서 반환되는 객체(인스턴스)를 개발자가 수동으로 빈에 등록되게 하는 어노테이션,

@Component는 클래스 레벨에서 스프링이 자동으로 빈을 찾고 등록하는 어노테이션이다. @Repository @Controller @Service 어노테이션은 MVC패턴을 위해 스프링에서 관리하는 어노테이션이다.

 

https://jojoldu.tistory.com/27

 

@Bean vs @Component

Spring으로 개발을 하다보면 @Bean과 @Component를 언제 써야할지 헷갈릴때가 있다. 둘다 목적이 명확하지 않은 Bean을 생성할때 사용하는 어노테이션인데 왜 2개로 나누어져있나 궁금했었는데, 박재성

jojoldu.tistory.com

 

https://baek-kim-dev.site/64#recentEntries

 

[카카오 면접] @Service,@Controller,@Component 차이

카카오 면접을 준비하면서, 공부했던 내용을 정리해놓고 다시 기억하기 위한 포스팅 @Component Spring에서 관리되는 객체임을 표시하기 위해 사용하는 가장 기본적인 annotation이다. 즉, scan-auto-detect

baek-kim-dev.site

 

 

2021-12-29 22:18:54

 

이동욱님이 집필하신 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'에서 제공하는 build.gradle에서 플러그인 관리와 스프링 이니셜라이저에서 기본적으로 제공하는 코드에 차이가 있었다.

 

buildscript{
    ext{
        springBootVersion = '2.1.7.RELEASE'
    }
    repositories{
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

책의 gradle

 

plugins {
    id 'org.springframework.boot' version '2.6.1'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

스프링 이니셜라이저 gradle

 

우선 코드 상에서 확인가능한 차이점은

 

1. buildscript + apply plugin에서 plugins( id + version ) 으로 변경.

buildscript 내부에서 ext를 통해 build.gradle에서 사용할 전역변수를 선언 후 ${변수명} 을 통해 사용하는 것이 아니라

플러그인 id와 version을 한 줄에 표기하는 방식으로 바뀌었다는 점

 

책에서 설명하는 방식의 buildscript 방식은 그레이들 4.3 이전의 방식으로 4.3 이후 그루비 그레이들은 plugins로 관리하는게 웹 문서에서 알려주는 표준 방식이라 생각 할 수 있을 것 같다.

 

빌드 스크립트를 찾아보면서 그레이들 관리가 Groovy DSL과 Kotlin DSL으로 나뉘는 점, 코틀린은 그레이들 5.0 이후 제공되는 기능이지만 그루비는 빌드 이전까지 오탈자 발견 등의 IDE 지원이 불가능하지만 코틀린은 가능하다는 장점, 안드로이드 개발자에겐 유용하다는 점이 있지만 스프링 이니셜라이저에서는 그루비로 그레이들을 제공해주었고, 그루비 DSL이 지원이 중단된다는 이야기도 없으니 개인의 취향 혹은 공부 삼아서 해보는 것도 좋을 것같다.

나중에 코틀린 변경으로 하는 점도 조사해서 포스팅 해봐야겠다.

 

다만 그레이들 5.0 이 후 부터는 롬복등에서 사용하는 어노테이션을  사용하기 위해 조금의 더 수정이 필요하다는 점과 실제 현업에서 아직 JUnit4와 그레이들 4를 사용하기에 책과 블로그에서 그레이들 4.10을 사용하신다는 점을 알려주셨다.

https://github.com/jojoldu/freelec-springboot2-webservice/issues/2

 

P74 테스트코드에서 에러가 발생합니다. · Issue #2 · jojoldu/freelec-springboot2-webservice

HelloResponseDtoTest.java에서 메소드 실행 시 아래와 같은 에러가 발생합니다. Testing started at 오후 11:08 ... Task :cleanTest UP-TO-DATE Task :compileJava FAILED C:\Users\ssooy\Desktop\dev\springboot-book\src\main\java\c...

github.com

https://kkambi.tistory.com/155

 

[gradle] gradle 5부터 lombok의 설정을 신경써야 한다

오류 상황 //build.gradle dependencies { //Util implementation "org.projectlombok:lombok" } //오류 메세지 error: variable courseRepository not initialized in the default constructor - build.gradle에..

kkambi.tistory.com

2. apply plugin: eclipse가 plugins에서 보이지 않는다는 점.

 

https://docs.gradle.org/current/userguide/eclipse_plugin.html

 

The Eclipse Plugins

To use either the Eclipse or the Eclipse WTP plugin, include one of the lines in your build script: Example 1. Using the Eclipse plugin build.gradle plugins { id 'eclipse' } build.gradle.kts Example 2. Using the Eclipse WTP plugin build.gradle plugins { id

docs.gradle.org

문서를 조금 찾아보니 자바 이클립스와의 호환성을 위해서 추가하던 플러그인으로 이클립스-웹프로젝트의 경우에는 eclipse-wtp로 수정해야하고 eclipse-wtp를 포함할 경우 eclipse는 포함하지 않아도 된다라는 내용이다.

 

아무래도 외부 프로젝트와 호환성을 위해 추가하신 내용인 것 같기도하고.. 아직은 잘 모르겠다.

 

2021-05-30 23:05:31

개인적으로 가장 신나서 썼던 과제가 아닌가 했다. GCP에서 했던 프로젝트를 AWS로 슬슬 환경을 옮긴 후에 과정을 포스팅할까 생각하던 차이기도 했고 분산 처리 실습을 할 때 GCP에서 읽어봤던 도큐먼트와 AWS에서 제공하는 기능의 도큐먼트는 기능적으로 차별점은 있지만 본 적 없는 기능이나 개념적으로 생소한 서비스가 있던 것은 아니라 작성하기 수월했다.

https://aws.amazon.com/ko/

클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services

제조 AWS를 활용한 Siemens의 에너지, 의료 서비스, 제조 분야 혁신 Siemens가 AWS를 사용하여 어떻게 문화를 바꾸고 혁신을 장려하며 비즈니스 성과를 창출했는지 알아보세요. 자세히 알아보기  업종

aws.amazon.com

https://youtu.be/rqxLw0hafFY

https://aws.amazon.com/ko/blogs/korea/preparing-for-game-launch-on-aws/

AWS 기반 게임 개발자를 위한 안내서 – 2부. 게임 출시 전 반드시 챙겨야 할 것들 | Amazon Web Services

전 세계에 대규모 게임 사용자를 위한 빠르고 민첩한 게임 서비스 개발을 위해 클라우드 활용은 필수가 되었습니다. 세계 최대 게임 회사의 90%가 AWS 기반 게임 서비스를 제공하고 있으며, 국내

aws.amazon.com

위 3가지는 카카오게임즈 채용정보에서 순서대로 제공되는 링크이다.

개인적으로 분산 처리 공부를 하면서 aws 영상 중에 마음에 드는 영상들을 좀 더 넣자면
https://youtu.be/HI0fPiZpniY

https://youtu.be/R1UWYQYTPKo


이 두 가지는 꼭 한 번 쯤 봐도 괜찮은 영상이라 생각한다.



AWS Route 53

  • 사용자가 게임 서버에 접속 시 DNS 제공.
  • 각 리전마다 존재하는 네임서버로 낮은 지연시간 보장


Amazon CloudFront, Amazon S3

  • 정적 데이터(게임 업데이트, css, html, js)를 저장.
  • 게임 패치 다운로드와 같은 동일한 작업을 캐시
  • 정적 데이터에 대한 트래픽과 서버에 대한 부하를 분산

ELB (Elastic Load Balancing)

  • 특정 서버의 트래픽 집중을 막기 위한 부하 분산기
  • 멀티 리전, 멀티 AZ에 맞춰 탄력성 있게 확장

Multi AZ

  • 서버 혹은 DB에서 장애 발생 시 대처
  • 내구성과 고가용성 확보
  • 손 쉬운 서버, DB 이중화를 통해 자동 장애 조치


Auto Scaling

  • 컴퓨팅 능력을 초과하는 트래픽 집중 혹은, 연산 시 서버 스케일 조절
  • 비용최적화를 위해 서버 사이즈를 조절하기 위해 중요
  • 서비스의 demand와 usage를 기반으로 서버의 scale-up, scale-down을 조절

Amazon SQS, Amazon Lambda

  • 디비 부하가 큰 작업이나 사용자가 많은 서비스에서 필수적인 메시지 큐를 SQS와 Lambda로 구현
  • 각 메시지의 우선순위 지정이나 오토 스케일링을 통해 프로세스 증, 감소 가능


RDS Replication, ElasticCache

  • DB 이중화를 통해 장애 발생 시 복구 가능
  • Master DB가 정상 작동 시, Slave DB는 Read Only Replica 역할 수행
  • 추가 옵션
    • RDS Read-Only Replication
      • 사용자의 증가로 읽기 부하 증가 시, Read Replica 기능으로 읽기 부하 감소
    • ElasticCache (memcached, redis)
      • 인메모리 관리형 캐시 서비스
      • 관리형 memcached, redis 지원
      • 장애 치유 기능 확보


2021-05-29 18:24:20


GNU/sed 명령어를 기준, 3306 포트만 열려있다고 가정했다.

A 서버에서 작동하는 스크립트

cp /home/myhome/sample_before.txt /home/myhome/sample_after.txt 
## sample_after.txt 파일 생성 

sed 's/10.1.2.3/10.1.2.4/' /home/myhome/sample_after.txt 
sed 's/test/svc/' /home/myhome/sample_after.txt sed 's/mypassword/mypassword!@#/' /home/myhome/sample_after.txt 
## 파일 내용 변경 

scp -P 3306 /home/myhome/sample_after.txt svc_user@10.1.2.4:/home/yourhome/
## 파일 전송

B 서버에서 작동하는 스크립트

scp -P 3306 test_user@10.1.2.3:/home/myhome/sample_before.txt /home/yourhome/ 
## A 서버에 존재하는 sample_before.txt 파일을 복사 

mv /home/yourhome/sample_before.txt /home/yourhome/sample_after.txt 
## 이름 변경, sample_before.txt -> sample_after.txt 

sed 's/10.1.2.3/10.1.2.4/' /home/yourhome/sample_after.txt sed 's/test/svc/' /home/yourhome/sample_after.txt sed 's/mypassword/mypassword!@#/' /home/yourhome/sample_after.txt 
## 파일 내용 변경

 

2021-05-29 18:11:24
사전과제 2번 플랫폼의 이해

2번 과제는 로그인, 카카오톡 친구 초대 기능의 시퀀스 다이어그램을 그리는 과제였다.
대략적인 기능의 시퀀스는 짐작되지만 SDK 가이드 링크와 각 환경 별 API 레퍼런스가 준비되어 있는 것을 보고 조금 더 구체적으로 실제 사용되는 시퀀스 다이어그램을 작성하는 것을 요구하는 것이라 생각했다.
포함 가능한 항목으로 클라이언트, 게임서버, 플랫폼SDK, 플랫폼 서버 4가지 명시되어 있기 때문에 로그인 인증기능에 사용되는 IDP 서버까지 플랫폼 서버로 통합했다.

Unity와 iOS는 사용해본 적이 없지만 다행히 Android 환경에서 작업해본 경험이 있어서 Android SDK API 레퍼런스를 기준으로 작성했다.

https://tech-wiki.kakaogames.com/display/SDK/Kakaogame+SDK+Guide+for+Channeling

Kakaogame SDK Guide for Channeling - Kakaogame SDK 3.0 Guide for Channeling - kakaogames

Skip to end of banner Go to start of banner Kakaogame SDK Guide for Channeling Skip to end of metadata Created by 최양민, last modified by Unknown User (zed.a@kakaogames.com) on 2017-05-15 Go to start of metadata 본 가이드는 Kakaogame SDK 및 Open

tech-wiki.kakaogames.com

https://kakao-sdk-release.s3.amazonaws.com/KakaoGameSDK/APIReference/Android/index.html

Generated Documentation (Untitled)

kakao-sdk-release.s3.amazonaws.com

로그인

DP 인증 센터에 등록 된 계정을 이용한 로그인 기능

카카오톡 친구초대(3.9.0 이상)

진행중인 초대 이벤트 조회하기

카카오톡 친구초대 기능을 사용하기 위해 초대 이벤트 정보를 조회하는 시퀀스 다이어그램

진행 중인 이벤트가 여러 개 존재할 수 있기 때문에 List 형태로 카카오톡 친구 초대 이벤트 정보를 받아와 이벤트 정보 속성을 저장

카카오톡 초대 가능한 추천 친구 목록 조회하기

카카오톡 친구 초대를 보내기 위해 초대 가능한 친구 목록을 조회하는 기능의 시퀀스 다이어그램


친구 목록을 조회하기 위해서 추천 친구 목록, 조회할 친구 목록의 오프셋, 조회 개수를 지정해주어야합니다.
조회에 성공 했다면 전체 친구 수와 친구 목록을 반환합니다

카카오톡 초대 메시지 보내기

카카오톡 초대 메시지를 보내는 기능의 시퀀스 다이어그램

카카오톡 초대 메시지를 보내기 위해서 이벤트 아이디, 수신할 사람의 카카오톡 프로필, 초대 메시지의 템플릿 아이디가 필요합니다.
Client 내부 저장소에 템플릿 아이디를 저장할 수 있지만 Game Server에서 템플릿 아이디를 조회해서 일관성을 유지한다고 가정

내가 초대 메시지를 보낸 친구 숫자 조회하기

내가 초대 한 친구 수를 조회하는 기능의 시퀀스 다이어그램


해당 초대 이벤트에서 초대 한 친구 수를 조회하기 위해 이벤트 아이디를 준비합니다.
조회 성공 시 초대한 친구의 전체 수와 게임에 가입한 친구 수를 반환합니다

내가 초대 메시지를 보낸 친구 목록 조회하기

내가 초대 한 친구 목록을 조회하는 기능의 시퀀스 다이어그램


해당 초대 이벤트에서 초대 한 친구 목록을 조회하기 위해 이벤트 아이디를 준비합니다.
조회 성공 시 게임에 가입한 친구 목록과 가입하지 않은 친구 목록을 반환합니다.

나에게 초대 메시지를 보낸 플레이어 숫자 조회하기

나를 초대 한 플레이어 수를 조회하는 기능의 시퀀스 다이어그램


해당 초대 이벤트에서 나를 초대 한 플레이어 수를 조회하기 위해 이벤트 아이디를 준비합니다.
조회 성공 시 해당 초대 이벤트에서 나를 초대한 플레이어 수를 반환합니다.

나에게 초대 메시지를 보낸 플레이어 목록 조회하기

나를 초대 한 플레이어 목록을 조회하는 기능의 시퀀스 다이어그램


해당 초대 이벤트에서 나를 초대 한 플레이어 목록을 조회하기 위해 이벤트 아이디를 준비합니다.
조회 성공 시 해당 초대 이벤트에서 나를 초대한 플레이어 목록을 반환합니다.
단, 나를 초대한 플레이어가 없을 수 도 있습니다.