분류 전체보기 441

[백엔드 스터디] 6주차 - JPA 영속성 컨텍스트

안녕하세요. 이번 6주차에는 JPA 영속성 컨텍스트에 대한 스터디를 진행하고자 합니다. 지난 주차와 마찬가지로 단순 단답 위주의 질문 보다는 서술이 가능한 질문 위주로 연습하도록 합니다. 영속성 컨텍스트란? 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 엔티티 매니저를 통해서 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. em.persist(object) 는 엔티티 매니저를 사용해서 object 엔티티를 영속성 컨텍스트에 저장한다는 의미이다. 영속성 컨텍스트의 특징 엔티티 매니저를 생성할 때 하나 만들어진다. 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하..

[백엔드 스터디] 5주차 - ORM과 JPA의 추상화 계층 그리고 특징들

이번 5주차에서는 본격적으로 JPA를 공부하기에 앞서서 ORM 그리고 JPA는 무엇이며 이러한 것들이 필요한 이유에 대해서 알아보는 시간을 가지고자 한다. 이번 주는 간단한 답변보다는 서술할 수 있는 수준에 초점을 맞추고자 합니다. 주제에 앞서 먼저 ORM와 JPA의 기본인 영속성에 대해 짚고 넘어가고자 합니다. Persistence Persistence란 무엇인가? Persistence 즉 영속성이란 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 말합니다. 영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 잃어버리게 됩니다. 즉 휘발성이 있습니다. Object Persistence인 영구적인 객체는 무엇일까요? 메모리 상의 데이터를 파일 시스..

[Test] Intellij에서 테스트 시 No tests found for given includes: 에러 발생

인텔리제이에서 테스트 빌드 중 아래와 같은 에러를 만났다. No tests found for given includes: 환경 상의 문제인 것 같은데 해결 방법은 간단하다. 인텔리제이 settings에 들어가서 gradle로 이동한다. 해당 설정 창에서 .Run tests using: 을 Intellij IDEA로 바꿔주면 작동한다. 출처는 아래와 같다. 감사합니다. https://ddasi-live.tistory.com/35 Intellij JUnit Test 실패 No tests found for given includes Intellij 에서 JUnit Test 할때에 아래와 같이 에러가 발생하였다. No tests found for given includes: filter.includeTestsM..

개발 정보 2023.01.30

[Gradle] gradle 빌드 중 error: unmappable character (0xED) for encoding x-windows-949 발생

터미널에서 gradlew build를 통해 빌드를 하던 도중 다음과 같은 에러를 만날 수 있다. error: unmappable character (0xED) for encoding x-windows-949 인코딩이 깨지는 현상인데 이건 Intellij에서 빌드를 통해 jar파일을 얻으려고 한 경우에는 해결방법이 이미 많이 나와있다. settings에서 빌드 옵션이 gradle인지 intellij로 되어있는지 확인해서 변경하면 되는 문제라서 인터넷에 잠깐만 검색해도 방법이 많이 나와있다. 다만 터미널에서 빌드를 하려고 하는 경우 어떻게 이 문제를 해결할 수 있을까? 지금까지 봤던 해결방법 중 가장 간단하고 효과적인 방법을 찾았다. build.gradle 파일에 아래와 설정을 적어준다. 이후 터미널에서 g..

개발 정보 2023.01.29

[백엔드 스터디] 4주차 - 컴포넌트 스캔 그리고 의존관계 자동 주입

이번 4주차 주제는 컴포넌트 스캔 그리고 의존관계 자동 주입이다. 컴포넌트 스캔이란? 스프링 빈을 등록할 때 구성파일에 @Bean을 등록해서 사용할 수 있었다. 하지만 관리할 빈이 많아지면 이 방식이 관리하기 번거로워진다. 그래서 굳이 빈 설정파일을 만들지 않거나 @Bean을 안쓰고 빈 등록을 할 수 있는 방식을 쓰게 되었다. 그게 @Component를 써서 컴포넌트 스캔을 하는 방식이다. 설정파일이 없다면 의존관계를 어떻게 주입할까? @Autowired를 사용해서 자동 의존관계 주입을 한다. 자동 의존관계 주입은 아래서 살펴본다. 컴포넌트 스캔이란 스프링이 스프링 빈으로 등록될 준비가 된 클래스들을 스캔해서 빈으로 등록해주는 과정을 말한다. @Component 어노테이션이 붙어있는 클래스들은 모두 컴포..

[UnrealEngine5] Unreal Engine5로 제작한 첫 시네마틱 영상

이번주에 시간이 남아서 언리얼5를 만져봤다. 예전에 한번 잠깐 배워본 적이 있었는데 거의 기억에 남아있지 않아서 이번에 좋은 학습 영상을 추천받아서 새롭게 살펴보았다. 그리고 학습 영상을 통해 하나의 시네마틱 영상을 제작해보았다. 카메라 움직임과 빛의 세기 등을 조절해서 첫 영화를 만들었다. 재밌게 배웠고 정말 뛰어난 툴이라는 생각이 든다. 아래 영상을 첨부한다. 4K라서 영상의 용량이 꽤나 크다. 그래서 카톡으로 다른 사람들에게 자랑하고 싶었지만 못했다. (카톡 전송용량을 초과해버려서 그렇다. 그래서 여기 올려서 링크로 보내줄거다.ㅎ) 조금 어설프지만 그래도 처음 만든 것 치곤 잘 만들었다.

Unreal Engine 2023.01.19

[Computer Graphics] 출력문이 렌더링 속도에 미치는 영향

오늘 시간이 남아서 평소 관심있던 컴퓨터 그래픽스를 살펴보고 있었다. 자바로 3D 오브젝트를 구현하는 내용을 공부 중이었는데 정말 흥미로운 문제를 만났다. 화면에 랜덤으로 색을 입힌 256 x 256 사이즈의 정사각형을 그려내고 해당 정사각형을 지속적으로 움직이도록 했는데 그려내는 속도가 연산 속도를 따라가질 못했다. 한마디로 화면에 그려내는 속도가 너무 느렸다. 아래 영상을 보면 무슨 말인지 알 것이다. 아래 영상을 보면 얼마나 느린지 체감이 될 것이다. (원래는 계속 이어지면서 그려야 한다는 걸 감안하면 뭔가 문제가 있다는 걸 알 수 있다. ) 그래서 추측을 해보게 되었다. 모니터에 그려내는 동작은 IO 작업이 굉장히 많이 일어나는 작업인데 분명 이 과정 어딘가에 병목이 있다고 생각했다. 어떻게 해결..

Computer Graphics 2023.01.19

[백엔드 스터디] 3주차 - Bean Scope 그리고 Bean 생명주기

1, 2주차 스터디에서 애매했던 질문에 대한 탐색은 다음과 같다. 1. IoC/ DI를 통해 응집도가 높아지는 이유? 2. 필드 주입의 단점 중 불변성이 있는데 왜죠? https://shanepark.tistory.com/368 -> 필드 인젝션은 immutable 불가라는 단점이 있다.이건 setter 주입에서도 마찬가지인데 필드 인젝션으로 주입받는 클래스는 final로 선언 할 수 없기 때문에 state safe하지 않다고 한다. (오직 Constructor Injection만 final 선언이 가능하다고 합니다. 그외의 방법들은 주입되는 필드에 대해 mutable한 상태를 만든다고 한다. 그래서 생성자주입이 권장되는 이유이기도 하다. https://sightstudio.tistory.com/20) ..

[Tech] DDD - 도메인 주도 설계란?

최근 여유가 생겨 라는 책을 읽고 있다. 흥미로운 개념들이 많이 나와서 재밌게 읽고 있는데 DDD에 대한 개념이 많이 등장한다. DDD에 대한 개념은 이전부터 알고 있었지만 추상적인 개념이라고 명확하게 이해하진 못한 것 같다. 개인적으로 어떤 개념이든 이런 수준의 높은 추상적인 개념, 방법론, 패턴, 철학 등은 본인이 직접 써보거나 신중하게 장단점을 판단하지 않은 이상 무턱대고 쓰지 말아야한다고 생각한다. 그래서 이번에 시간을 갖고 DDD 관련 자료를 여러 개 탐색해보고 그 내용을 정리해보고자 한다. 도메인이란? 소프트웨어로 해결하고자 하는 문제 영역이다. 즉 비즈니스 영역이다. 도메인 주도 설계란? 도메인을 중심으로 하는 개발방식이다. 도메인에 관련된 문제를 해결하는게 핵심이다. 복잡한 도메인을 해결하..

개발 정보 2023.01.06

[백엔드 스터디] 2주차 - Spring Container(ApplicationContext)

2주차 백엔드 스터디에서는 Spring Container(ApplicationContext)에 대해 알아보고자 한다. Container란? 스프링에서 컨텍스트(Context)는 스프링이 관리하는 빈들이 담겨 있는 컨테이너라고 이해하면 된다. ApplicationContext란? ApplicationContext는 BeanFactory의 모든 기능을 포함하며, BeanFactory보다 추천되는 개념이다. 트랜잭션 처리, AOP에 대한 처리를 할 수 있으며 BeanPostProcessor, BeanFactoryPostProcessor 등을 자동으로 등록하고, 국제화 처리, 어플리케이션 이벤트 등을 처리할 수 있다. 스프링 컨테이너라고 말하면 일반적으로 ApplicationContext를 의미한다고 보면 된다..

[백엔드 스터디] 1주차 - DI, IoC 그리고 DI Container

백엔드 스터디 1주차 내용을 정리하고자 합니다. 1주차에 다루고자 하는 내용은 DI, IOC 그리고 DI Container 입니다. DI 란? Dependency Injection은 의존성 주입이라고 부릅니다. 쉽게 말해 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴입니다. 인터페이스를 사이에 둬서 클래스 레벨에서 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입해서 유연성을 확보하면서도 결합도를 낮출 수 있는 패턴입니다. 여기서 의존성(Dependency)은 두 클래스 사이의 관계로 설명할 수 있습니다. A 클래스가 B클래스를 A클래스 내부의 변수로 사용한다고 가정할때 A클래스는 B클래스와 의존관계가 형성되었다고 말합니다. 그리고 이런 상황에서 B클래스를 수정하면 A클래스도 수정..

[Tech] CORS 란? - Cross origin resource sharing

주말이라 블로그를 탐방하면서 백엔드 관련 기술 질문을 보고 있었는데 CORS에 대한 정확한 개념을 알고 있는지 의문이 들었다. CORS가 다른 도메인의 자원을 요청했을때 거부 당하는 개념이라고 알고 있는데 추가적인 내용은 알지 못했다. 다행히도 우테코에 CORS에 대한 굉장히 좋은 자료가 올라와있었다. 관련 자료들을 보고 요약하고 정리한 내용을 간단하게 써보고자 한다. Origin이란? url의 Protocol, Host, Port를 통해서 같은 출처인지 판단할 수 있다. SOP란? same origin policy의 약어이다. 다른 출처의 리소스를 사용하는 것에 제한하는 보안 방식이다. 왜 SOP을 사용해야 할까? 해커가 링크를 담은 메일을 보낸다. 클릭을 한 곳에 가면 해커가 만든 주소로 간다. 이때..

개발 정보 2023.01.01

[Java] ConcurrentModificationException 예외 해결 방법

오늘 Java로 MUD 게임을 개발하던 중 ConcurrentModificationException 이라는 예외를 만나게 되었다. 지금까지 개발하면서 이 예외를 처음 본 것 같다는 생각이 들었다 . 이전에 본 적이 있다면 조금이라도 기억이 날텐데 이 예외는 왠지 오늘 처음 발생한 예외라고 생각했다. 자료구조를 순회하면서 해서는 안되는 동작에 대해 알고 있다면 발생하지 않는 예외에 속한다. 왜 발생하는 지와 그 해결 방법에 대해서 간단하게 알아보고자 한다. 핵심은 간단하다. 자료구조를 순회하면서 우리는 특정 원소에 대해 Delete 연산을 수행하게 되는데 이때 자료구조를 for loop으로 순회하면서 .size() 혹은 len() 혹은 .legth를 통해 loop 횟수를 정해줬을 것이다. 그런데 순회하는 ..

Java 2022.12.08

[GCP] GCP 생성방법

https://wildeveloperetrain.tistory.com/169 GCP 인스턴스 SSH 접속하는 방법 앞전에 아래 포스팅의 과정을 통해 구글 클라우드 플랫폼 GCP 무료 서버를 생성했었는데요. 서버 생성 후 'SSH 키를 통해 해당 서버에 접속하는 방법'에 대해 정리한 내용입니다. 해당 과정대로 진 wildeveloperetrain.tistory.com https://minimin2.tistory.com/171 [GCP] 구글 클라우드 프리티어(무료) 사용하기 GCP란?GCP는 Google Cloud Platform의 약자로 구글에서 제공하는 클라우드 플랫폼이다. 클라우드 플랫폼은 대표적으로 AWS, GCP, Azuer등이 있다.원래 AWS의 1년 프리티어를 사용하고 있었는데, 1년이 다되어..

Cloud/GCP 2022.12.05

[Redis] redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value

Jedis 를 사용해서 게임 서버를 작성하던 중 아래와 같은 예외를 만났다. redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value 사실 위 예외가 발생하는 정석적인 이유는 그저 타입이 맞지 않기 때문이다. 그런데 나의 경우에는 예외가 발생하지 않을 것이라고 예상한 상황에 예외가 발생했다. 아래 코드를 보자. 참고로 아래 코드는 예외가 발생하지 않도록 수정한 코드이다. 위 코드에서 sadd 하는 부분이 문제였다. 문제가 발생했던 코드에서는 sadd의 첫번째 파라미터인 Key로 nickname을 전달했었다. 그런데 nickname이 이미 Key로 잡혀있는..

Database/Redis 2022.12.02

[Java] 외부에서 스레드를 안전하게 종료하는 방법

프로젝트를 진행하면서 Thread를 활용해야 하는 작업을 진행하고 있었다. 그러면서 특정 조건에서 Thread를 죽여야만 하는 상황이 존재했는데 어떻게 하면 외부에서 Thread를 죽일 수 있는지에 대해 고민하고 있었다. Thread의 run 내부에서는 보통 while true를 활용해서 무한 루프를 돌기 마련인데 이걸 특정 Flag를 활용해서 while true 가 아니라 while !flag 와 같은 식으로 while 문을 돌면서 flag 를 검사해주는 방식으로 할 지에 대해 고민했다. 결국에는 외부에서 해당 Thread 내에 있는 boolean stop flag 변수에 접근해서 해당 변수의 값을 바꿔주었고 while로 무한 루프를 돌던 Thread는 해당 stop flag 값이 true가 되었음을 ..

Java 2022.11.30

[Java] 생성자에서는 getInstance호출에 신중하자.

오늘 코드를 작성하던 중 신기한 현상을 만났다. 게임 서버를 구동했는데 정상 작동하지 않았다. 신기하게도 아무런 에러도 찍히지 않았다. 분명 어딘가 문제가 있을 것이라고 생각하고 살펴보았지만 짐작가는 곳은 없어서 빠르게 해결하기 위해 출력문으로 찍어보고 문제의 핵심을 찾았다. 아래 두 코드 부분을 보자. 두 코드는 각각 Game과 RedisTemplate의 생성자에 관한 코드이다. 왼쪽에 존재하는 Game에서는 RedisTemplate의 객체를 getInstance를 통해 받아오려 하고 있다. 오른쪽의 RedisTemplate 또한 Game의 객체를 getInstance를 통해 받아오려 하고 있다. 참고로 Game와 RedisTemplate 모두 싱글톤으로 작성되어있다. 그렇다면 이렇게 생성자 내에서 서..

Java 2022.11.30

[Java] Java에서 Redis 를 사용해보자. Jedis 사용하기

Java에서 Redis 를 사용해보자. Java 에서 Redis 를 쓸 수 있도록 Jedis 가 이미 준비되어있다. Gradle 에는 다음과 같이 추가한다. // https://mvnrepository.com/artifact/redis.clients/jedis implementation group: 'redis.clients', name: 'jedis', version: '2.8.0' 이후 아래 코드와 같이 redisTemplate 을 작성할 수 있다. redisTemplate 이란 redis 의 기본적인 명령어들을 method를 호출함으로써 사용할 수 있게끔 래핑한 클래스라고 볼 수 있다. 아래 예시를 천천히 살펴보자. // redisTemplate 아래 블로그에서 많은 도움을 받았습니다. 감사합니다...

Java 2022.11.23

[Java] PrintWriter 의 AutoFlush 사용

TCP 상에서 Client와 Server 상에서 문자열을 주고받는 것을 확인하려고 하는 와중에 문제가 발생했다. 아무리 client에서 입력을 하고 readLine으로 읽어들인 문자열을 server 쪽으로 보내려고 해도 server 상에서 받았다는 표시가 뜨지 않았다. 즉 아예 받지 못한 문제가 발생했다. 컴파일이나 런타임 에러도 아니고 그저 의도된 작동이 재현되지 않는 것이 문제였다. 문제의 원인은 금방 찾을 수 있었다. 원인은 PrintWriter에서 AuthFlush 를 사용하지 않았기 때문이다. 이제 문제가 발생한 배경에 대해서 알아보도록 하겠다. 우리는 통상 TCP 소켓 프로그래밍을 할때 server 쪽으로 전송하기 위해 client에 다음과 같은 코드를 작성하게 된다. in = new Buff..

Java 2022.11.23

[C++] C++ 기초 개념 정리

1. 레퍼런스 = 참조자 레퍼런스는 반드시 처음에 누구의 별명이 될 것인지 지정해야 한다. int& another_a; 이렇게 하는건 불가능함. 반면에 포인터는 int* p; 이렇게 하는게 가능함. 또한 레퍼런스는 한 번 별명이 되면 절대로 다른 이의 별명이 될 수 없다. 또한 레퍼런스는 메모리 상에 존재하지 않을 수도 있다. 진짜 그냥 별명이라고 생각하면 된다. 왜 포인터 대신 참조자를 사용할까? 불필요하게 *나 &를 많이 쓸 필요가 없기 때문이다. 레퍼런스는 있는데 원래 참조하던 것이 사라진 것을 댕글링 레퍼런스라고 한다. 그러니 지역 변수의 레퍼런스를 리턴하지 않도록 주의하자. 레퍼런스를 리턴하는 장점? 레퍼런스가 참조하는 타입의 크기와 상관 없이 딱 한 번의 주소값 복사로 전달이 끝나게 됨. 하지..

C & C++/C++ 2022.11.13

[Tech] WAS와 웹서버의 차이

웹 서버는 클라이언트가 브라우저에서 어떤 페이지 요청을 하면 웹 서버에서 그 요청을 받아서 정적 컨텐츠를 제공하는 서버이다. 정적 컨텐츠는 주로 HTML, CSS, Javascript, 이미지 등을 말한다. 웹 서버 종류: Apache, Nginx, IIS WAS 는 웹 서버 단독으로는 처리할 수 없는 데이터베이스의 조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공한다. WAS 종류: Tomcat, JBoss 웹 서버는 정적 컨텐츠만 처리하도록 기능 분배를 해서 서버 부담을 줄인다. WAS 를 통해 요청에 맞는 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때마다 결과를 제공하면서 자원을 효율적으로 사용할 수 있다. 만약 WAS 가 정적 컨텐츠 요청까지 처리하면, 부하가 커지고 동적 컨텐츠 처리가..

개발 정보 2022.11.12
반응형