📚 Springboot
✍🏻 태그기능
- 글에 태그를 저장하고 태그로 글을 검색할 수 있다
- Tag 엔티티 필요 ,생성한 tag를 저장할 TagRepository 필요
- 글 저장할 때 Tag 엔티티 생성 -> 클라이언트가 쓴 tag 를 String으로 받아와서 구분한 후 생성해야함
- Til (글) 과 Tag는 일대다 관계
📌 Source Code
✔ Tag
package com.cdp.tdp.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@Entity
public class Tag extends Timestamped {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long idx;
@Column(nullable = false)
private String name;
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST,CascadeType.REMOVE})
@JoinColumn(name="til_id", nullable = false)
private Til til;
public Tag(String name, Til til) {
this.name = name;
this.til = til;
}
public Tag(String name) {
this.name = name;
}
}
✔ Til (tag 와 연관관계된 부분)
@JsonIgnore
@OneToMany(mappedBy="til")
private List<Comment> comments;
✔ TilService (tag 와 연관관계된 부분)
public Til createTil(TilRequestDto tilRequestDto, Long id) throws SQLException {
User user = userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("no such user"));
Til til = new Til(tilRequestDto, user);
//System.out.print(til);
tilRepository.save(til);
String[] tagArray = tilRequestDto.getTags().split("\\s*,\\s*");
List<Tag> tagList = new ArrayList<>();
for (int i = 0; i < tagArray.length; i++) {
Tag tag=new Tag(tagArray[i],til);
tagList.add(tag);
}
tagRepository.saveAll(tagList);
return til;
}
- tilRequestDto 로 받아온 정보로 til을 저장
- tilRequestDto 로 get 해온 tag들을 문자열로 구분해서 하나하나 Tag를 생성한다
- 생성한 모든 tag를 tagRepository에 저장
❗ 나는 tag에 대해서 til 정보를 저장해주었는데 til 개체에 대한 tag 정보는 저장해주지 않았다. 하지만 til 개체에서 일대다 관계를 tag와 형성해주었기 때문에 내가 til을 조회하면 tag 정보를 조회한다.
✍🏻 검색기능
📌 Controller에서 get parameter 받는 방법
- @RequestParam(value = "keyword") String keyword
- EX)
@GetMapping("/til/search")
public List<Til> SearchTil(@AuthenticationPrincipal UserDetailsImpl userDetails,@RequestParam("keyword") String keyword, @RequestParam("setting") String setting2){
return tilService.getUserTil(userDetails.getUser());
}
📌 자바 문자열비교
- 나는 파이썬이 너무 익숙해서 '==' 메소드를 사용했기에 계속 오류가 났던 것임 ㅜ
✔ '=='
String s1 = "abcd";
String s2 = new String("abcd");
- 위 코드에서 s1==s2 를 할 경우 False 가 나온다. 일반 객체처럼 Heap 영역에 생성된 String 객체와 리터럴을 이용해 string constant pool에 저장된 String 객체의 주소값은 다를 수밖에 없음 따라서 이러한 상황을 방지하기 위해 .equals 메소드 사용을 해야함
✔ equals
- String 클래스안에 있는 equals라는 메서드를 사용하면 두 비교대상의 주소 값이 아닌 데이터값을 비교하기 때문에 데이터 값만 가지고 비교가능!
✔ Source Code
- TilService (search 기능 부분)
public List<Til> SearchTil(String keyword,String setting)
{
if(setting.equals("제목"))
{
return tilRepository.findAllByTilTitle(keyword);
}
else if(setting.equals("작성자"))
{
User user = userRepository.findByUsername(keyword)
.orElseThrow(() -> new UsernameNotFoundException("로그인 오류"));
return tilRepository.findAllByUser(user);
}
else // 태그
{
return tilRepository.findAllByTagsName(keyword);
}
}
✍🏻 서버에 로그남기기
📌 사용법
- 사용하고자 하는 클래스 위에 @Slf4j 붙히기
- application.properties 에 밑 코드 추가
# 콘솔 창에 출력되는 로깅 메세지를 색으로 구분해서 출력
spring.output.ansi.enabled=always
# 로그 메세지가 저장되는 로그 디렉터리
logging.file.path=logs
# logging.level.{패키지 경로}를 통해 로깅 레벨을 결정할 수 있슴
logging.level.gil.toy.medihealth=trace
- 출력하고자 하는 부분 log.info() 으로 출력