Teamproject-28

조형찬·2023년 6월 5일

TeamProject 일지

목록 보기
28/34

6.5. 팀프로젝트 진행상황

  • 로그인 로그 기능 구현

로그인 로그 기능을 구현하기 위해 시도했던 단계.

  1. MemberLoginLog entity에 Id mid, logingLog 두개만 있었다.
  2. 로그인 성공 핸들러에서 아래와 같은 방법으로 추가하려고 했었다.
    기존의 로그인 기록을 리스트형으로 저장하고 새로운 내용을 추가하여 다시 저장하는 방법을 사용
    결과 - 새로운 내용이 누적되는 것이 아니라 같은 Id값의 내용을 갱신하였음.
    save를 하는과정에서 해당 Id값을 찾아가고 찾아간 곳에서 데이터를 set하기 때문에 갱신되는 문제라 생각하였다.
    따라서 Id는 sequence를 사용하여 자동으로 생성하고 MID,loginLog를 따로 저장하는 방법으로 선택하였다.

List<MemberLoginlog> memberLoginlogs = memberlogRepository.findAll();

// 새로운 로그인 기록 객체 생성
MemberLoginlog newMemberLoginlog = new MemberLoginlog();
newMemberLoginlog.setMid(memberSecurityDTO.getMid());
newMemberLoginlog.setLoginlog(LocalDateTime.now());

// 새로운 로그인 기록 객체를 별도의 리스트에 추가
List<MemberLoginlog> newMemberLoginlogs = new ArrayList<>(memberLoginlogs);
newMemberLoginlogs.add(newMemberLoginlog);

// 새로운 로그인 기록들을 한 번에 저장
memberlogRepository.saveAll(newMemberLoginlogs);

MemberLoginlog entity수정
id값은 자동으로 생성되고, Mid,loginlog값을 그때마다 추가하는 식으로 하였다.
사용자 성별, 나이, 레벨 등의 정보도 추가할 예정이다.


@Entity
@Getter
@Builder
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Table(name = "MEMBERLOGINLOG")
@SequenceGenerator(
        name = "MEMBERLOGINLOG_SEQ_GENERATOR",
        sequenceName = "MEMBERLOGINLOG_SEQ",
        initialValue = 1,
        allocationSize = 1
)

public class MemberLoginlog {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator = "MEMBERLOGINLOG_SEQ_GENERATOR")
    @Column(name = "id")
    private Long id;
    private String mid;
//    private String usersex;
//    private String userage;
//    private long userlev;
    private LocalDateTime loginlog;

}

sequence가 잘 반영되어서 저장되는지 테스트, Mid가 중복되어도 문제없이 저장되었다.


@SpringBootTest
//@Transactional
@ToString
class MemberLoginlogTest {
    @Autowired
    private MemberLogRepository memberLoginlogRepository;

    @Test
    void testMemberLoginlogSave() {
        String[] mids = {"aa", "aa", "bb", "cc", "dd", "dd", "dd"};
        int[] logs = {1, 2, 3, 4, 5, 6, 7};

        for (int i = 0; i < mids.length; i++) {
            // 새로운 MemberLoginlog 생성
            MemberLoginlog memberLoginlog = MemberLoginlog.builder()
                    .mid(mids[i])
                    .loginlog(LocalDateTime.now())
                    .build();

            // 저장
            memberLoginlogRepository.save(memberLoginlog);

            // 시퀀스로 생성된 ID 확인
            Assertions.assertNotNull(memberLoginlog.getId());
        }

    }
}

소셜로그인 성공 핸들러에서 사용한 코드
소셜 로그인의 경우 mid에 memberSecurityDTO.getMid()를 사용하고, 일반 로그인 핸들러에서는 username을 사용한다.


   MemberLoginlog memberLoginlog = MemberLoginlog.builder()
                .mid(memberSecurityDTO.getMid())
                .loginlog(LocalDateTime.now())
                .build();
        memberlogRepository.save(memberLoginlog);

id값이 중복되더라도 값을 누적하여 저장할 수 있을 거라 생각해서 계속 Id값을 고정했던것이 시간이 오래걸렸던 원인이라 생각한다.
이제 이 누적된 로그기록을 바탕으로 관리자 페이지에서 유의미한 정보를 얻을 수 있도록 할 것이다.

profile
서버개발 공부중

0개의 댓글