728x90

오늘은 코딩 테스트 사이트인 Hackerrank라는 사이트에 대해 소개를 해볼까 합니다.

 

Hackerrank는 최근 모 기업 코딩테스트를 보면서 처음 만나게 된 사이트인데,

코딩테스트, 기술 체크 등 포괄적으로 본인이 가지고 있는 기술을 체크할 수 있는 사이트인 거 같습니다.

 

코딩테스트의 경우 Hackerrank는 모든 문제가 영어로 작성되어있는 만큼 문제 해석에 시간이 오래 걸릴 수 있는데요,

이러한 점 때문에 프로그래머스, 백준 보다 문제 자체를 이해하는데 살짝 어렵다고 개인적으로 느꼈습니다.

 

코딩 문제의 경우 백준 기준 브론즈부터 골드 1문제까지의 난이도를 만나보았으며, 문제의 난이도와 종류 그리고 언어에 따른 문제들도 다양하게 존재하고 있습니다.

 

코딩 테스트를 연습하고 싶다!! 라고 한다면 30 Days of code 라는 챌린지 형태의 튜토리얼도 지원해 주어 코딩 테스트 준비가 어색하다 하면 한 번쯤 해보는 것을 추천드립니다. 난이도는 매우 쉬움부터 날이 갈수록 어려워지는 구조로 코딩 테스트라는 것에 익숙해지는데 도움을 많이 받았습니다.

 

일반 코딩테스트 문제들만 존재한다면 굳이 소개를 할 필요는 없겠죠 제가 소개하게된 큰 이유는 기술 검증 메뉴에 있습니다.

 

이 기술 검증이란 주어진 시간내에 해당 주제에 대해 여러 문제들을 주고, 이를 통과하였을 때 인증서를 제공하는 서비스인데요,

Java와 Sql등 여러 가지의 언어들과 테스트할 수 있는 것들이 존재하는 만큼 본인이 어느 정도 자신이 있다 생각하면 한번 응시하여 기술 검증을 받아보는 것이 좋을 것 같습니다.

 

기술 검증은 계정당 1회 가능하며 만약 통과를 하지 못할 경우 재응시가 불가 하니 주의 바랍니다.

추후 업데이트를 통해 재응시가 가능하도록 하겠다 하지만 언제 업데이트가 이뤄질지 모르니 공부하고 응시해 보시기를 권장합니다.

 

기술 검증에 통과하게 되면 아래와 같이 이쁜 인증서도 지급해주니 인증서를 모아보는 것도 하나의 취미로 삼아도 괜찮을 것 같습니다.

 

HackerRank Skill Certificate

Join over 23 million developers in solving code challenges on HackerRank, one of the best ways to prepare for programming interviews.

www.hackerrank.com

 

 

 

Dashboard | HackerRank

Join over 23 million developers in solving code challenges on HackerRank, one of the best ways to prepare for programming interviews.

www.hackerrank.com

 

728x90
728x90

작업 환경

OS: Ubuntu

Tool: Intellij

Builder: gradle

Framework: Spring-Boot

Language: Java

KafkaVersion: kafka_2.13

Kafka 설치 및 실행

  1. zookeeper 실행
# 다운받은 kafka 디렉토리 내에서 실행하였을 때 경로
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/zookeeper-server-start.sh ./config/zookeeper.properties 
  1. kafka-server 실행
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-server-start.sh ./config/server.properties
  1. topic 생성 - 이벤트 저장할 주제
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-topics.sh --create --topic ${원하는topic명:kafka-test} --bootstrap-server ${사용하길 원하는 주소:localhost:9092}
  1. topic 생성 확인
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-topics.sh --describe --topic ${topicName:kafka-test}  --bootstrap-server ${Address:localhost:9092}
Topic: kafka-test    TopicId: JW42CEjhS1qqnwIZ1cvdzQ    PartitionCount: 1    ReplicationFactor: 1    Configs: 
    Topic: kafka-test    Partition: 0    Leader: 0    Replicas: 0    Isr: 0
  1. Producer로 Event 발신
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-console-producer.sh --topic ${topicName:kafka-test} --bootstrap-server ${Address:localhost:9092}
>This is my first event
  1. Consumer로 Event수신
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-console-consumer.sh --topic ${topicName:kafka-test} --bootstrap-server ${Address:localhost:9092}

Docker로 작업

  1. Apache Kafka Image Download
docker pull apache/kafka:3.7.0
  1. Kafka Docker Container 생성 및 실행
docker run -p 9092:9092 apache/kafka:3.7.0 

 


참고

https://kafka.apache.org/quickstart

 

작업공간

https://github.com/KrongDev/kafka

728x90
728x90

초기화 단계

1. Awake

실행시 처음 한번만 실행

종속성 초기화를 할 때 사용

2. OnEnable

오브젝트 활성화 시 실행

초기화 혹은 오브젝트 재설정 할 때 사용

3. Start

첫번째 프레임이 업데이트 되기 전에 호출

Awake()이후 활성화 된 상태일 때 처음 한번만 호출

초기 설정할때 사용


게임 플레이 단계

1. FixedUpdate

물리연산( 고정 ) 주기로 실행

물리연산과 관련된 업데이트에 사용

2. Update

매 프레임마다 실행

게임 작동 로직등에 호출

3. LateUpdate

Update()호출 이후에 실행

애니메이션, 카메라 등 후처리에 사용


비활성화 및 종료 단계

7. OnDisable

오브젝트 비활성화시 실행

이벤트 핸들러 해제, 타이머 정지 등 필요한 정리 작업에 사용

8. OnDestroy

오브젝트 해체할 때 실행

메모리 해제 및 자원 정리 시 사용

728x90

'Unity' 카테고리의 다른 글

Basic Unity Moving  (0) 2024.06.02
Basic Unity Interface  (0) 2024.06.02
728x90

1. 화면

Action Description Etc
Q + 드래그 화면을 이동할 수 있다  드래그 버튼을 눌러 움직였을 때 같은 효과를 볼 수 있습니다.
W +  드래그 오브젝트를 이동할 수 있다  
E + 드래그 오브젝트를 회전할 수 있다. 선과 내부 회색 구체로 자유로운 회전가능
R + 드래그 오브젝트 크기를 조절할 수 있다.  
T 사각툴 2D에서 사용

 2. 카메라

Action Description Etc
우클릭 카메라 회전  
Alt + 좌클릭 오브젝트 기준으로 카메라 회전  
방향키 카메라 자유이동  
카메라 줌 누를 시 이동
728x90

'Unity' 카테고리의 다른 글

Frame Lifecycle in Unity  (0) 2024.06.02
Basic Unity Interface  (0) 2024.06.02
728x90

기본적인 Unity화면 구성요소에 대해 알아보겠습니다.

 

 

1. Hierarchy

게임구성에 필요한 오브젝트들을 계층구조로 관리하는 부분

2. Scene

오브젝트들을 실제 배치하는 부분

카메라를 통해 인게임 내 송출되는 화면을 확인하며 작업이 가능합니다.

XYZ, 회전등을 통한 자유로운 화면 조절 및 오브젝트 배치가 가능합니다. 

3. Inspector

오브젝트들의 속성들을 확인하고 관리하는 부분

오브젝트에 애니메이션, script등을 주입하는 곳입니다.

4. Projects

프로젝트전체를 관리하는 부분

 

728x90

'Unity' 카테고리의 다른 글

Frame Lifecycle in Unity  (0) 2024.06.02
Basic Unity Moving  (0) 2024.06.02
728x90

주제: JPA

참여인원: 2

발표내용:

JPA를 사용하거나 JPA를 사용하여 CRUD작업 시 제대로 고민하고 사용하지 않았거나, 다른 분들은 어떤 문제들을 만나보았고 어떻게 해결을 하였는지를 학습해 보았습니다.

 

기본적으로 ORM이란 무엇인가, JPA와 그리고 Persistemce Context에 대해 다뤄보았으며, 이에 대하여 추가적으로 Querydsl과 같은 프레임워크에 대하여 간단하게 알아보는 시간을 가졌습니다.

 

이에 해당 발표자료와 학습을 할 때 검증한 프로젝트를 기록합니다.

JPA_2024_05_25.pdf
2.79MB

 

728x90
728x90

Spring Framework에서  Bean을 주입받기 위해 lombok에서 제공하는 RequiredArgsConstructord어노테이션을 사용하셔 보셨을 것입니다.

 

하지만 이때 Qualifier를 사용하게 된다면 원하던 Bean을 주입받지 못하는 현상이 발생합니다.

 

이 글에서는 왜 @Quailifier가 정상적으로 작동하지 않는 이유와 정상적으로 작동하려면 어떻게 해줘야 하는지에 대해 알아보도록 하겠습니다.

 

왜 적용이 안되는가?

이를 위해서는 lombok이 어떻게 빈을 주입받을 수 있게 해주는지 즉 작동 방법에 대해 알아볼 필요가 있습니다.

 

우선 우리는 lombok을 Getter, Setter, AllArgsConstructor, Builder 등 우리가 코딩을 해서 만들어도 되지만 컴파일할 때 자동으로 명시한 어노테이션의 기능들을 자동으로 생성되게 도와주는 라이브러리입니다.

위와 같이 컴파일을 거치게 되면 명시된 어노테이션은 사라지고 개발자가 직접 작성하지 않은 코드가 생성되는 것을 확인할 수 있습니다.

 

그럼 이제 어떤 역할을 하는 라이브러리인지 알았으니 오늘의 주제 @RequiredArgsConstructord는 왜 @Qualifier가 적용되지 않는가? 에 대해 알아보도록 하겠습니다.

 

우선 @RequiredArgsConstructord@Qualifier에 대해 모르시는 분들은 아래 글을 보고 마저 봐주시기 바랍니다. 

 

[Spring] Bean은 어떻게 생성하고 주입할까?

우리는 Spring Framework에 대해 많이 들어보았고, 공부했고, 사용을 해보았을 것입니다. 기본적으로 Bean 어노테이션을 사용하여 Bean으로 등록하여 개발자가 직접 생성을 하여 사용하지 않아도, Sprin

lee-geon-exception.tistory.com

 

우선 일반 생성자로 만들고 Compile을 할 경우 아래와 같이 생성자 파라미터에 Qualifier로 어떤 Bean을 주입받을 것인지 명시가 되어있습니다.

@RestController
@RequestMapping({"/connect"})
public class ConnectTestController {
    private final Test bean;

    public ConnectTestController(@Qualifier("test1") Test bean) {
        this.bean = bean;
    }

    @GetMapping
    public String connect() {
        System.out.println(this.bean.text);
        return "OK";
    }
}

 

아래 코드는 @RequiredArgsConstructord를 사용하여 만든 코드를 컴파일한 코드입니다.

@RestController
@RequestMapping({"/connect"})
public class ConnectTestController {
    @Qualifier("test1")
    private final Test bean;

    @GetMapping
    public String connect() {
        System.out.println(this.bean.text);
        return "OK";
    }

    public ConnectTestController(final Test bean) {
        this.bean = bean;
    }
}

 

다른 점이 보이시나요??

위 생성자를 직접 생성하여 Qualifier를 사용한 경우 생성자에 파라미터로 주입받을 때 명시적으로 붙어있지만 lombok에서 지원해 주는 어노테이션을 사용할 경우 final로 Test타입의 bean을 주입받겠다고 작성되어 있습니다.

 

이럴 경우 Bean의 명칭이 달라 test1으로 지정한 Bean을 주입받지 못하고 다른 Bean을 주입받거나 아예 못 받는 경우가 생기는 것입니다.

어떻게 해결할 수 있는가??

우선 가장 쉬운 방법은 위에 보여드린 것처럼 직접 생성자를 작성하는 방법이 있고, @Autowired를 사용하여 필드 주입을 해주는 방법이 존재합니다.

 

하지만 우리가 lombok을 사용하는 가장 큰 이유 코드를 덜 작성하고 싶다!! 는 니즈를 충족하는 방법이 있는데, 이는 lombok.config를 설정하는 것입니다.

 

src/main/java경로에 lombok.config파일을 생성 후 아래 코드를 작성해 주면 lombok에서 compile시 코드를 만들어 줄 때 해당 설정을 통해 Qualifier를 반영하여 생성해 주는 것을 확인할 수 있습니다.

더보기

아래 사이트는 project lombok 공식 사이트 configuration 설정할 수 있는 설정들에 대한 설명입니다.

 

Configuration system

 

projectlombok.org

 

lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier

Compile 결과물

@RestController
@RequestMapping({"/connect"})
public class ConnectTestController {
    @Qualifier("test1")
    private final Test bean;

    @GetMapping
    public String connect() {
        System.out.println(this.bean.text);
        return "OK";
    }

    public ConnectTestController(@Qualifier("test1") final Test bean) {
        this.bean = bean;
    }
}

 

728x90

'Server' 카테고리의 다른 글

[Kafka] 설치하기  (0) 2024.06.07
[스터디] JPA에 대하여  (0) 2024.05.25
[Spring] Bean은 어떻게 생성하고 주입할까?  (0) 2024.05.01
SSE란? - Server Sent Events  (2) 2024.04.18
REST API란?  (0) 2024.04.14
728x90

우리는 Spring Framework에 대해 많이 들어보았고, 공부했고, 사용을 해보았을 것입니다.

 

기본적으로 Bean 어노테이션을 사용하여 Bean으로 등록하여 개발자가 직접 생성을 하여 사용하지 않아도, Spring Context 내에서 Bean을 인식하고 생성하여 관리하도록 하였을 것입니다.

 

이번 글에서 어떻게 사용할 Bean으로 인지하게 할 수 있는지, 또 어떻게 사용할 수 있을지 등을 확인해 보도록 하겠습니다.

Bean 등록

Bean으로 등록하려면 여러 가지 방법이 존재합니다.

1. @Bean

Bean 어노테이션의 경우 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려 할 때 사용합니다.

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
    @AliasFor("name")
    String[] value() default {};

    @AliasFor("value")
    String[] name() default {};

    boolean autowireCandidate() default true;

    String initMethod() default "";

    String destroyMethod() default "(inferred)";
}

Bean어노테이션 내부를 보면 위와 같이 구현되어 있으며 사용할 때는 아래와 같이 정의를 할 수 있습니다.

@Configuration
public class TestConfiguration {

    @Bean
    public String testDescription() {
        return "test";
    }
}

위와 같이 정의를 한다면 이제 testDescription이라는 Bean이 생성되는 것이고 이를 사용하려면 @Autowired와 같이 메서드 명으로 주입받아 사용할 수 있습니다.

@Autowired
private String testDescription;

 

2. @Component

개발자가 개발한 Class를 Bean으로 등록하기 위해 사용하는 어노테이션입니다.

 

@Bean어노테이션과 다르게 Class자체를 Bean으로 등록하는 것으로, 위의 @Bean어노테이션을 사용하여 Bean으로 등록해도 괜찮지만, 개발자가 제어가 가능하여 @Component를 사용합니다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
    String value() default "";
}

어노테이션 자체는 위와 같이 구현되어 있으며, Class, interface, enum 등에 지정할 수 있습니다.

 

@RestController
@RequestMapping("/connect")
public class ConnectTestController {
    //
    @Autowired
    private Test testDescription;

    @GetMapping()
    public String connect() {
        System.out.println(testDescription.testDescription());
        return "OK";
    }
}

위 controller를 보면 Test라는 클래스를 Bean으로 등록하고, 이를 사용하는 부분인데 , Bean과 다르게 변수명을 클래스 명과 다르게 명시하였음에도 정상적으로 주입받는 것을 확인할 수 있습니다.

 

이를 통해 @Component어노테이션을 사용하여 Bean으로 등록할 경우 주입받는 Type에 맞춰 주입받는 것을 확인할 수 있습니다.

 

Bean 주입

위에 글에서도 나왔듯 @Autowired처럼 Bean들을 주입받을 수 있는 방법들이 존재며,

이는 생성자 주입(Constructor Injection), 필드 주입(Field Injection), 수정자 주입(Setter Injection)등이 존재합니다.

1. Constructor

해당 객체가 Bean으로 등록될 때 생성자에 명시되어 있는 파라미터들을 즉 Bean들을 주입받는 방식입니다.

 

가장 기본적이라 생각하며, 가장 코드 줄이 긴 방법이지만 가장 직관적인 만큼 오류가 가장 발생하지 않는 방법입니다.

@RestController
@RequestMapping("/connect")
public class ConnectTestController {
    //
    private final Test testDescription;

    public ConnectTestController(Test testDescription) {
    	//주입받는 부분
        this.testDescription = testDescription;
    }

    @GetMapping()
    public String connect() {
        System.out.println(testDescription.testDescription());
        return "OK";
    }
}

2. @RequiredArgsConstructor

lombok의 @RequiredArgsConstructor를 사용하는 방법입니다.

@RestController
@RequestMapping("/connect")
@RequiredArgsConstructor
public class ConnectTestController {
    //
    private final Test testDescription;

    @GetMapping()
    public String connect() {
        System.out.println(testDescription.testDescription());
        return "OK";
    }
}

위와 같이 생성자를 직접 명시하지 않고 사용하는 방법이며 final로 지정된 전역변수들에 한해서 빈을 자동으로 주입해 줍니다.

3. @Autowired

위 방법들과 다르게 필드 주입 혹은 수정자 주입받을 때 사용하는 방법입니다.

기본적으로 Springframework에서 제공해 주는 @Autowired어노테이션을 사용합니다.

필드 주입

@RestController
@RequestMapping("/connect")
public class ConnectTestController {
    //
    @Autowired
    private Test testDescription;

    @GetMapping()
    public String connect() {
        System.out.println(testDescription.testDescription());
        return "OK";
    }
}

수정자 주입

@RestController
@RequestMapping("/connect")
public class ConnectTestController {
    //
    private Test testDescription;

    @Autowired(required = false)
    public void setTestDescription(Test testDescription) {
        this.testDescription = testDescription;
    }

    @GetMapping()
    public String connect() {
        System.out.println(testDescription.testDescription());
        return "OK";
    }
}

위처럼 두 가지 방법으로 구현이 가능한 방법입니다.

 

생성자 주입방식보다 번거롭고 코드 줄이 길어 가독성이 불편하며, 개발자 실수가 많이 이뤄질 수 있는 방법으로 권장하는 Bean주입 방법은 생성자 주입방법을 권장하고 있습니다.

 

 

기타

@Qualifier

Qualifier은 동일한 타입의 Bean들이 많을 때 어떤 Bean을 주입받을지 명시할 때 사용하는 어노테이션입니다.

@Component
public class Test {

    public String text = "test";

    @Bean
    @Qualifier("test1")
    public Test testDescription() {
        Test test =  new Test();
        test.text = "hello";
        return test;
    }
}

우선 Bean을 2개 지정해 보도록 하겠습니다. 하나는 Test라는 Bean이고 하나는 test1이라는 Bean을 등록하였습니다.

위처럼 @Qualifier를 지정하여 사용할 경우 해당 이름으로  Bean이 생성됩니다.

 

@RestController
@RequestMapping("/connect")
public class ConnectTestController {
    //
    @Autowired
    @Qualifier("test1")
    private Test bean;
    @Autowired
    private Test test;

    @GetMapping()
    public String connect() {
        System.out.println(bean.text);
        System.out.println(test.text);
        return "OK";
    }
}

 이후 위처럼 각각 정의를 하고 실행을 하였을 때 아래와 같은 실험 결과를 얻어볼 수 있습니다.

 

이처럼 같은 타입을 반환하는 Bean들 중 하나를 지정하여 주입받을 때 사용하는 어노테이션입니다.

728x90

'Server' 카테고리의 다른 글

[스터디] JPA에 대하여  (0) 2024.05.25
[lombok]RequiredArgsConstructord와 Qualifier  (0) 2024.05.03
SSE란? - Server Sent Events  (2) 2024.04.18
REST API란?  (0) 2024.04.14
[Docker] 도커로 데이터 베이스 편하게 사용하자~  (1) 2024.04.08

+ Recent posts