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

이수영·2021년 12월 1일
0

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개의 댓글