[내일배움캠프] #211130 💻 TIL 💻

이수영·2021년 12월 1일

MY TIL 

목록 보기
45/50
post-thumbnail

📚 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() 으로 출력
profile
Hongik Univ 💻

0개의 댓글