티스토리 뷰

이번포스팅에서는 나만의 라이브러리를 만들어서 프로젝트에 적용해보도록 하겠다. 사용된 코드는 깃허브에 있습니다! 또한 이미 라이브러리를 완성한 후 적는거라 이미 완성 되어있는 것들은 감안해서 보셨으면 좋겠습니다.

 

현재 프로젝트에서는 게시글을 쓴 작성자와 해당 게시글에 댓글을 단 유저들한테 푸시메세지를 보내는 로직이 있다. 

private void send(String token, String nickname) {
        try {
            sendPushNotification(token, nickname);
        } catch (ExecutionException | InterruptedException e) {
            throw new InvalidNotificationException();
        }
    }

 

sendPushNotification 메서드는 보낼 메세지를 생성한 후 FCM에 보낸다. 

private void sendPushNotification(String token, String nickname) throws ExecutionException, InterruptedException {
        Message message = createPushMessage(token, nickname);
        FirebaseMessaging.getInstance().sendAsync(message).get();
    }

 

createPushMessage는 토큰과 메세지를 받는 유저의 닉네임을 받아 메세지를 만든 후 반환시킨다. 

private Message createPushMessage(String token, String nickname) {
        return Message.builder()
                .setWebpushConfig(WebpushConfig.builder()
                        .setNotification(WebpushNotification.builder()
                                .setTitle(PUSH_NOTIFICATION_TITLE)
                                .setBody(nickname + PUSH_NOTIFICATION_BODY)
                                .build())
                        .build())
                .setToken(token)
                .build();
    }

 

이러한 로직을 일일이 구현하지 않아도, send 메서드만 호출해도 쉽게 쓸 수 있게 라이브러리로 구현하겠다. 인텔리제이에서 new -> project로 들어가서 아래와 같이 세팅해준다. (Name만 바꿔주었다.)

 

 

그리고 build.grade에 plugins에 아래 명령어를 추가해주자.

id 'maven-publish'

 

gradle 버전을 추가하고, Jitpack에 배포하기 위한 설정들을 한다.

sourceCompatibility = 11
targetCompatibility = 11

publishing {
    publications {
        maven(MavenPublication) {
            from components.java
        }
    }
}

java {
    withSourcesJar()
    withJavadocJar()
}

 

마지막으로 FCM 관련 로직을 사용하기 위해 firebase와 편리한 기능을 제공하는 롬북 의존성을 추가한다. 

compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
implementation 'com.google.firebase:firebase-admin:9.1.1'

 

코드는 간단하게 기존에 구현된 로직에서 조금만 변형하도록 하겠다.

public class TaskdbPushMessage {
    private static final String TITLE = "TaskDB";
    private static final String BODY = "님이 답변을 등록하였습니다.";
    private static final String SEND_FAIL = "전송 실패";

    public static void send(String token, String nickname) {
        try {
            sendPushNotification(token, nickname);
        } catch (ExecutionException | InterruptedException e) {
            throw new IllegalArgumentException(SEND_FAIL);
        }
    }

    private static void sendPushNotification(String token, String nickname) throws ExecutionException, InterruptedException {
        Message message = createPushMessage(token, nickname);
        FirebaseMessaging.getInstance().sendAsync(message).get();
    }

    private static Message createPushMessage(String token, String nickname) {
        return Message.builder()
                .setWebpushConfig(WebpushConfig.builder()
                        .setNotification(WebpushNotification.builder()
                                .setTitle(TITLE)
                                .setBody(nickname + BODY)
                                .build())
                        .build())
                .setToken(token)
                .build();
    }
}

 

이제 github에 레파지토리를 생성해준 후 프로젝트를 푸시한다. 그리고 아래 빨간 박스를 눌러준다.

 

 

Tag와 제목, 내용은 원하는 이름을 적어준 후 Create new tag 버튼을 누른다.

 

 

이제 배포만 하면 끝이다! JitPack 페이지에 들어가서 자신의 레파지토리 링크를 넣고 Look up을 누른다. 그럼 아까 추가했던 Releases의 Tag 이름이 보일 것이다. Get it을 눌러서 로그가 실패하지는 않는지 확인해보자. 

 

 

아마 실패가 뜰 것이다. 왜 실패했는지 찾아보면, 11버전이라서 실패했다는 것을 알려준다. 

 

 

다시 프로젝트를 열고, 루트 경로에 jitpack.yml이라는 이름을 파일을 생성해준다.

 

 

아래 명령어를 붙여넣기 한다. 이렇게 해야지 11버전에서도 배포가 된다고 한다.

jdk: openjdk11

 

그리고 다시 jitpack 페이지에 가서 Look up을 눌러 확인해보자. ver2.0은 jitpack.yml을 넣지 않았고, ver1.7은 넣고 돌렸다.

 

 

이제 의존성을 원하는 프로젝트에 추가하고 사용하기만 하면 된다. 밑으로 내려보면 grade에 넣어야 하는 코드를 보여준다. 프로젝트에서 기존에 구현했던 코드들을 지우고 send만 넣어보도록 하겠다. 

 

 

기존 프로젝트 또한 build.grade에 jitpack에서 적용하라고 했던 것들을 적용한 후 gradle 동기화를 시켜준다.

 

 

그럼 내가 커스텀한 라이브러리가 추가된 것을 볼 수 있다.

 

 

만들었던 TaskdbPushMessage 클래스를 정의하고 send메서드를 호출해준다.

    @Transactional(readOnly = true)
    public void sendMessage(String nickname, Question question) {
        List<String> tokens = getTokenByCommentUsers(question);
        tokens.forEach(token -> TaskdbPushMessage.send(token, nickname));
    }

 

import는 다음과 같이 된다.

import org.example.TaskdbPushMessage;

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday