성실한 사람이 되자

성실하게 글쓰자

This is spear

Tools/IntelliJ

인텔리제이 롬복에서 빨간줄(오류)이 계속 나오다면( 개발 툴내에 lombok 설정하기)

Imaspear 2020. 6. 13. 13:27
728x90

안녕하세요 여러분~ 

 

화난다...

 

개발하다 보면 나오는 오류들.. 우선 스프링 부트에서 Developer tools에서 lombok을 설정하여도 빨간 줄은 계속 나오죠...

스프링 부트를 이용하면서 롬복 어노테이션을 지정해도 빨간줄이 나온다면 처음에는 매우 황당할 수도 있어요~

실제로 프로그램내에서 롬복 어노테이션을 인지해 잘 돌아가지만 개발 툴에서는 롬복 어노테이션은 인식을 못하죠

 

만약 이클립스를 사용하고 계시다면 밑에 포스트를 이용하시면 됩니다!

https://imspear.tistory.com/61

 

이클립스 롬복에서 빨간줄(오류)이 계속 나오다면( 개발 툴내에 lombok 설정하기)

간단하게 롬복을 설치해서 이클립스에 넣어주면 됩니다. 만약 인텔리제이 개발 툴을 이용하고 계시다면 아래의 링크를 따라가 확인하시면 됩니다. https://imspear.tistory.com/17 인텔리제이 롬복에서

imspear.tistory.com

 

 

 

우선 간단하게 테스트하는 것도 작성하였으니

바쁘신 분들은 중간의 롬복 플러그인 설정 부터 읽어주시길 바랍니다~

 

 

 

 

 

스프링 부트 제네레이션 하기


더보기

그럼 스프링을 이용해 간단하게 프로젝트를 하나 생성해 보도록 하겠습니다~

https://start.spring.io/

실질적으로는 많은 Dependencies가 필요하지만 우리는 롬복 설정만 확인할 것이기 때문에 3개만 지정할 거예요~~

  1. Lombok
  2. Spring Data Jpa
  3. h2 Databases

 

 

 

 

 

 

알집 파일로 저장이 되는데 이걸 압출 풀고~

개발 툴에서 파일 오픈 ~

 

오픈 오픈!

 

 

저 같은 경우에는 다운로드 폴더에 풀었기 때문에 다운로드 폴더에서 찾았어요~

어디에 압출 풀었는지 기억하기!!

 

 

 

 

 

조금 많이~ 기다리 시가 보면 이런 식으로 폴더들이 생성이 됩니다~ (pom.xml을 이용해 설정해주는 중)

짜자잔 생각보다 오래걸려요 ㅠㅠ

 

 

파일 및 클래스 생성


폴더 구조 

우선 폴더들을 생성하고 밑에 클래스들을 하나씩 작성해보도록 하죠. 파일들이 Class 파일인지 Interface, Enum 인지 잘 확인해야 해요!!

 

Domain folder


더보기

Board.java // domain

@Getter
@NoArgsConstructor
@Entity
@Table
public class Board {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idx;

    @Column
    private String title;

    @Column
    private String subTitle;

    @Column
    private String content;

    @Column
    @Enumerated(EnumType.STRING)
    private BoardType boardType;

    @Column
    private LocalDateTime createdDate;

    @Column
    private LocalDateTime updatedDate;

    @OneToOne(fetch = FetchType.LAZY)
    private User user;

    @Builder
    public Board(Long idx, String title, String subTitle, String content, BoardType boardType,
                 LocalDateTime createdDate, LocalDateTime updatedDate, User user) {
        this.idx = idx;
        this.title = title;
        this.subTitle = subTitle;
        this.content = content;
        this.boardType = boardType;
        this.createdDate = createdDate;
        this.updatedDate = updatedDate;
        this.user = user;
    }
}

 

롬복을 이용하면 자동으로 Getter 가 생기지만 아래의 사진을 보다시피 Board 도메인에는 Getter가 존재하지 않아요~

프로그램 상으로는 자동적으로 생겨서 실행되지만, 개발 툴은 그걸 인지하지 못하죠

 

Structure 

 

User.java // domain

package com.tistory.imaspear.domain;

import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;

@Getter
@EqualsAndHashCode(of = {"idx","email"})
@NoArgsConstructor
@Entity
@Table
public class User {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idx;

    @Column
    private String name;

    @Column
    private String password;

    @Column
    private String email;

    @Column
    private LocalDateTime createdDate;

    @Column
    private LocalDateTime updatedDate;

    @Builder
    public User(Long idx, String name, String password, String email,
                LocalDateTime createdDate, LocalDateTime updatedDate) {
        super();
        this.idx = idx;
        this.name = name;
        this.password = password;
        this.email = email;
        this.createdDate = createdDate;
        this.updatedDate = updatedDate;
    }


}

 

Enums folder


더보기

BoardType Enum // Enum입니다!! 

enum 타입을 이용해 게시글을 분류할 거예요

package com.tistory.imaspear.domain.enums;

public enum  BoardType {
        notice("공지사항"),
        free("자유게시판"),
        list("게시글");

        private String value;

    BoardType(String value) {
        this.value = value;
    }

    public String getValue(){
        return this.value;
    }
}

 

Repository folder


더보기

BoardRepository Interface // 인터페이스예요!!

JpaRepository를 이용해 repository를 이용할 겁니다

package com.tistory.imaspear.repository;

import com.tistory.imaspear.domain.Board;
import com.tistory.imaspear.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {
    Board findByUser(User user);
}

 

 

UserRepository Interface // 인터페이스예요!!

package com.tistory.imaspear.repository;

import com.tistory.imaspear.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByEmail(String email);
}

 

 

Test 작성!


 

 

테스트 폴더에서 MappingonJpaTest 생성

 

MappingonJpaTest.class // Test 

 

package com.tistory.imaspear;

import com.tistory.imaspear.domain.Board;
import com.tistory.imaspear.domain.User;
import com.tistory.imaspear.domain.enums.BoardType;
import com.tistory.imaspear.repository.BoardRepository;
import com.tistory.imaspear.repository.UserRepository;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

import java.time.LocalDateTime;

@RunWith(SpringRunner.class)
@DataJpaTest
public class MappingonJpaTest {
    private final  String boardTestTitle = "test";
    private final  String email = "https://imspear.tistory.com/";
    @Autowired
    UserRepository userRepository;

    @Autowired
    BoardRepository boardRepository;


    @Before
    public void in(){
        User user = userRepository.save(User.builder()
                .name("imspear")
                .password("imspear")
                .email(email)
                .createdDate(LocalDateTime.now()).build());

        boardRepository.save(Board.builder()
                .title(boardTestTitle)
                .subTitle(boardTestTitle)
                .content("boardTestTitle")
                .boardType(BoardType.notice)
                .createdDate(LocalDateTime.now())
                .updatedDate(LocalDateTime.now())
                .user(user).build());
    }

    @Test
    public void TestGo(){
        User user = userRepository.findByEmail(email);
        assertThat(user.getName(), is("imspear"));
        assertThat(user.getPassword(), is("imspear"));
        assertThat(user.getEmail(), is(email));

        Board board = boardRepository.findByUser(user);
        assertThat(board.getTitle(), is(boardTestTitle));
        assertThat(board.getSubTitle(), is(boardTestTitle));
        assertThat(board.getContent(), is("boardTestTitle"));
        assertThat(board.getBoardType(), is(BoardType.notice));
    }
}

 

assertThat() 함수와 is() 함수가 자동으로 임포트 되지 않는다면 직접 넣어주셔야 합니다.

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

 

잠끄안!! @RunWith , @Before을 임포트 못 시킨다면!! 밑에 부분을 읽어주세요!!

더보기

이렇게 RunWith 어노테이션을 찾지 못한다면 현재 사용하는 JUnit version을 4가 아닌 다른 버전을 사용하고 있는 상황입니다. 이런 경우네는 JUnit4 버전으로 변경해서 사용하거나, JUnit5 버전에서의 RunWith를 대체하는 어노테이션을 찾아야 합니다. 

 

마찬가지로 @Before 어노테이션 또한 JUnit5에서는 @BeforeEach와 @BeforeAll로 변경되었으니 잘 참고하시고 작성하시길 바랍니다.

 

이렇게 RunWith 어노테이션을 찾지 못한다면 현재 사용하는 JUnit version을 4가 아닌 다른 버전을 사용하고 있는 상황입니다. 이런 경우네는 JUnit4 버전으로 변경해서 사용하거나, JUnit5 버전에서의 RunWith를 대체하는 어노테이션을 찾아야 합니다. 

 

마찬가지로 @Before 어노테이션 또한 JUnit5에서는 @BeforeEach와 @BeforeAll로 변경되었으니 잘 참고하시고 작성하시길 바랍니다.

 

@Before 어노테이션

 

 

이렇게 실행해도 되요~

실제로 돌아갑니다 

 

 

 

 

이거 정말 돌아가는 거 맞아???

@Builder 어노테이션을 인지하지 못함
getter 함수를 익식하지 못함

 

 

위와 마찬가지로 인텔리제이의 개발 툴이 롬복을 인지하지 못해 Getter 들을 수작업으로 써줘야 합니다. ㅠㅠ 이와 같은 상황을 방지하기 위해서 개발 툴에 롬복 플러그인을 설정해줘야 수월한 코딩이 될 것입니다.!!

 

 

 

 

롬복 플러그인 설정


위에 보이는 마켓 플레이스로 이동 ~

 

설치!

설치 다음 IDE를 재설치하면 됩니다!!

 

 

 

 

 

 

롬복 게터 설정 완료~


Board.class domain

짜즈안~~  Board의 Getter 들이 생겨났어요!!

 

 

User.class domain

User 또한 마찬가지 

 

MappingonJpaTest.class

 

테스트 내에서도 빨간 줄은 볼 수 없습니다~~

 

 

이제 롬복 플러그인 설정이 끝났습니다. 되게 간단하지만 플러그인을 설치하지 못한다면 한동안 힘들겠지요..ㅎㅎ 

롬복 말고도 안드로이드 개발할 때의 플러터 등 많은 플러그인들이 존재하니까 한 번쯤은 시간을 들여서 뭐가 있는지 구경하는 것도 좋을 거 같아요 ㅎㅎ 

이만 오늘의 마카롱은 여기까지~

1