package com.example.service;
import java.util.List;
import com.example.entity.Member;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
// DB연동을 실제로 수행하는 구현부
// 프레임워크에 따라
@Service
public class MemberDBImpl implements MemberDB {
// 환경설정으로 생성된 객체를 가져옴
@Autowired
private MongoTemplate mongodb;
@Override
public Member insertMember(Member member) {
try {
return mongodb.insert(member);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public List<Member> selectListMember() {
try {
Query query = new Query();
return mongodb.find(query, Member.class);
} catch (Exception e) {
return null;
}
}
@Override
public int deleteMember(String id) {
try {
Member member = new Member();
member.setId(id);
DeleteResult result = mongodb.remove(member);
if (result.getDeletedCount() == 1L) {
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
@Override
public Member selectOneMember(String id) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(id);
query.addCriteria(criteria);
return mongodb.findOne(query, Member.class);
} catch (Exception e) {
e.printStackTrace(); // 개발자를 위한 출력(debug용)
return null;
}
}
@Override
public int updateMember(Member member) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(member.getId());
query.addCriteria(criteria);
Update update = new Update();
update.set("name", member.getName());
update.set("age", member.getAge());
UpdateResult result = mongodb.updateFirst(query, update, Member.class);
if (result.getModifiedCount() == 1L) {
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
@Override
public Member selectLogin(Member member) {
try {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(member.getId()));
query.addCriteria(Criteria.where("pw").is(member.getPw()));
return mongodb.findOne(query, Member.class);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public long updateMemberPassword(Member member) {
try {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(member.getId()));
query.addCriteria(Criteria.where("pw").is(member.getPw()));
Update update = new Update();
update.set("pw", member.getNewPw());
UpdateResult result = mongodb.updateFirst(query, update, Member.class);
return result.getModifiedCount();
} catch (Exception e) {
e.printStackTrace();
return -1L;
}
}
@Override
public List<Member> selectListPageSearchMember(int page, String text) {
try {
Query query = new Query();
// 검색 패턴( .*a.* => a가 포함된 것 검색)
Criteria criteria = Criteria.where("name").regex(".*" + text + ".*");
query.addCriteria(criteria);
// 페이지네이션
Pageable pageable = PageRequest.of(page - 1, 10);
query.with(pageable);
// 정렬
Sort sort = Sort.by(Direction.DESC, "_id");
query.with(sort);
return mongodb.find(query, Member.class);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public long CountSearchMember(String text) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("name").regex(".*" + text + ".*");
query.addCriteria(criteria);
return mongodb.count(query, Member.class);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
}