스프링부트

[스프링 부트] 비트 마스킹 사용해서 데이터 처리하기

컴공코딩러 2023. 10. 30. 14:36

 

내가 진행했던 테오의 스프린트 15기 (23.06.21 - 23.06.26)

 

우리는 멋진 길거리 사진을 소개하는 프로젝트를 만들었다.

 

 

 

게시글 내용은 이런식으로 보이고 태그기능을 사용하여 게시물을 검색할 수 있었다.

 

하지만 개발 기간은 스프린트 형식으로 진행되기 때문에 2일.. 짧은 기간동안 태그 기능을 간단히 구현하고 싶었다.

 

또한 백앤드는 한명..(본인)

 

그래서 비트마스킹으로 구현해보면 어떨까 라는 생각에 의견을 제시했고 결국 프론트분들을 설득시켜 성공하였다..

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
export const tagList: Tag[] = [
  { id: 0name"편안한" } as Tag,
  { id: 1name"조용한" } as Tag,
  { id: 2name"친근한" } as Tag,
  { id: 3name"활기찬" } as Tag,
  { id: 4name"새로운" } as Tag,
  { id: 5name"오래된" } as Tag,
  { id: 6name"이국적인" } as Tag,
  { id: 7name"숨은명소" } as Tag,
  { id: 8name"커피명소" } as Tag,
  { id: 9name"야경명소" } as Tag,
  { id: 10name"자연경관" } as Tag,
  { id: 11name"반려동물과 함께" } as Tag,
];
cs

태그는 프론트에서 이런식으로 구현되어있고 

당연히 11개의 값이라 11개의 비트를 사용해서 구현하였다!. 모든 비트가 켜져있으면 2^11 = 2048

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class UserPost extends BaseTimeEntity{
    @Id
    @Column(name="post_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ColumnDefault("0")
    private int viewCount;
    @Size(min = 2, max = 250,message = "내용은 2~500자 사이로 입력해주세요.")
    private String content;
    private String detailImageUrl;
    private String thumbnailImageUrl;
    private Double lat;
    private Double lng;
    private String address_name;
    private String tags;
    private Long tagsNum;
    private String profileImage;
    private String music_id;
}
cs

데이터는 이렇게 구성되어있고 tags는 비트형식으로 String 으로 변환하여 프론트에게 전달된다.

 

만약 조용한 활기찬이 체크되어있다면 01010000000 (ID 1번과 3을 1로 표기 ,앞에서부터 체크)

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    @Operation(summary = "주변 게시물 찾기 API")
    @GetMapping("/find-near-post/{lat}/{lng}/{tags}")
    public Slice<PostsDto> getBoardListFromUserSearch(@PageableDefault(size = 6,sort = "createdDate",direction = Sort.Direction.DESC) @Parameter(hidden = true) Pageable pageable
    , @PathVariable Double lat, @PathVariable Double lng, @PathVariable String tags) {
        Long tags_num=convertTags(tags);
        for (int i=0;i<userPostData.size();i++){
            if ((tags_num&userPostData.get(i).getTagsNum()))==tags_num){
                userPostList.add(userPostData.get(i));
            }
        }
        return getUserPostsDto(pageable,userPostList);
    }
cs

 

사용자가 게시물을 찾을때 태그를 체크한거 & 연산을 통해 비트가 켜져있는지

확인하여 이런식으로 태그된 게시물을 불러 올수 있도록 하였다.

(태그 체크 이외에 코드는 지웠다)

 

 

 

 

잘 작동되는 모습...