안녕하세요 여러분~
개발하다 보면 나오는 오류들.. 우선 스프링 부트에서 Developer tools에서 lombok을 설정하여도 빨간 줄은 계속 나오죠...
스프링 부트를 이용하면서 롬복 어노테이션을 지정해도 빨간줄이 나온다면 처음에는 매우 황당할 수도 있어요~
실제로 프로그램내에서 롬복 어노테이션을 인지해 잘 돌아가지만 개발 툴에서는 롬복 어노테이션은 인식을 못하죠
만약 이클립스를 사용하고 계시다면 밑에 포스트를 이용하시면 됩니다!
https://imspear.tistory.com/61
우선 간단하게 테스트하는 것도 작성하였으니
바쁘신 분들은 중간의 롬복 플러그인 설정 부터 읽어주시길 바랍니다~
스프링 부트 제네레이션 하기
그럼 스프링을 이용해 간단하게 프로젝트를 하나 생성해 보도록 하겠습니다~
실질적으로는 많은 Dependencies가 필요하지만 우리는 롬복 설정만 확인할 것이기 때문에 3개만 지정할 거예요~~
- Lombok
- Spring Data Jpa
- 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가 존재하지 않아요~
프로그램 상으로는 자동적으로 생겨서 실행되지만, 개발 툴은 그걸 인지하지 못하죠
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.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로 변경되었으니 잘 참고하시고 작성하시길 바랍니다.
실제로 돌아갑니다
이거 정말 돌아가는 거 맞아???
위와 마찬가지로 인텔리제이의 개발 툴이 롬복을 인지하지 못해 Getter 들을 수작업으로 써줘야 합니다. ㅠㅠ 이와 같은 상황을 방지하기 위해서 개발 툴에 롬복 플러그인을 설정해줘야 수월한 코딩이 될 것입니다.!!
롬복 플러그인 설정
설치 다음 IDE를 재설치하면 됩니다!!
롬복 게터 설정 완료~
Board.class domain
User.class domain
MappingonJpaTest.class
테스트 내에서도 빨간 줄은 볼 수 없습니다~~
이제 롬복 플러그인 설정이 끝났습니다. 되게 간단하지만 플러그인을 설치하지 못한다면 한동안 힘들겠지요..ㅎㅎ
롬복 말고도 안드로이드 개발할 때의 플러터 등 많은 플러그인들이 존재하니까 한 번쯤은 시간을 들여서 뭐가 있는지 구경하는 것도 좋을 거 같아요 ㅎㅎ
이만 오늘의 마카롱은 여기까지~
'Tools' 카테고리의 다른 글
2. 도커의 간단한 응용(Docker) (0) | 2020.06.26 |
---|---|
1. 윈도우에서 도커 시작하기(install Doker) (0) | 2020.06.26 |
이클립스 롬복에서 빨간줄(오류)이 계속 나오다면( 개발 툴내에 lombok 설정하기) (0) | 2020.06.20 |
Visual Studio Code에서 JavaScript 웹 상에서 확인하기 (Live Server 이용하기) (0) | 2020.06.18 |
STS4 설치/다운로드 (Spring Tool Suites4) (0) | 2020.05.27 |