java

국비 코딩 풀스택 수업 40일차 제너릭 클래스, 추상화, cursor, iterator, first, Map, Filters.and, Updates.combine

비루블 2022. 8. 19. 12:57

시험 
물품 수정
추가
삭제
조회

테이블 하나

 

요약정리

insertOne 출력 결과에 따른 데이터 꺼내기

 

아직 selectlist 안함. map으로 만들어 본다는데 오후에 할 예정(CourseServiceImpl.java)

entity에서 변수의 타입(중요)

view쪽으로 집중공부

 

데이터 꺼내줄 때 어떻게 꺼내줄껀지 고민할때 아래 두개 고민하다가 결국 하나라서 first()를 씀.

cursor?

iterator?

first?

데이터 가져올때 쓰는 cursor, iterator개념 정리 해야할 듯.

 

List, Map, cursor, iteratro 개념 정리

https://brandpark.github.io/java/2021/01/24/iterator.html

 

[ JAVA ] Iterator의 내부동작 - 자바니또의 Tech선물

개요 요즘 코딩테스트 준비를 위해 알고리즘 문제들을 풀고있다. 그러던 중 옆에서 같이 공부하던 생각한대로 동작하지 않는다며 보여준 코드를 보고 이번 포스팅의 주제를 정했다. public void met

brandpark.github.io

 

selectOne할때 교수 정보 들고 오는 것 중요중요중요중요

쿼리문 합치기 (Filters.eq , Filters.and)

업데이트 합치기 (Updates.set, Updates.combine)

 

출력 결과가 이상하게 나오면
entity에 toString확인

 

 

regex 포함된 문자 찾기

Bson query = Filters.regex("name", ".*" + text + ".*");

 

map

selectlist

 

추상화 클래스

설계를 할때 함수를 만들고 그 함수의 순서 같은 것을 만들때 추상화가 좋음.

또한 추상화된 서비스에서 코드기입으로 작업 가능(인터페이스는 무조건 impl에서 해야함)

 

웹은 인터페이스 형식을 많이씀
안드로이드는 abstract를 많이 씀.(복잡)



오전일과
RepositoryService<T> 제너릭 클래스

package com.example.service;

import java.util.List;
import java.util.Map;

// Course
public interface RespositoryService<T> {
    // 등록
    public short insert( T obj );

    // 수정
    public short update( T obj );
    
    // 삭제
    public short delete( T obj );
    
    // 1개 조회
    public T selectOne( T obj );
    
    // 전체 조회
    public List<T> selectList( int page, String text );
    // 전체 조회 (파라미터 1개)
    public List<T> selectList( Map<String, Object> map );
}


CourseServiceImpl

RespositoryService에서 T로 선언 해줬기 때문 형태를 Course로 선언해줌

package com.example.service;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.bson.Document;
import org.bson.conversions.Bson;

import com.example.config.MongoConfig;
import com.example.entity.Course;
import com.example.entity.Professor;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.InsertOneResult;
import com.mongodb.client.result.UpdateResult;

public class CourseServiceImpl implements RespositoryService<Course>{

    // 생성자 => DB접속하고 collection정보 가져오기
    // 교과목 저장용
    private MongoCollection<Document> collection = MongoConfig.create().getConnection("courses");
    // 시퀀스 저장용
    private MongoCollection<Document> collectionSeq = MongoConfig.create().getConnection("counters");

    // 교수
    private MongoCollection<Document> collectionPro = MongoConfig.create().getConnection("professors");


    // short(16) -> int(32) -> long(64)
    @Override
    public short insert(Course obj) {
        try{
            // 1. 값을 가져올 조건
            Bson query = Filters.eq("id", "SEQ_COURSE_NO");
            // 가져온 값 이후의 변경 조건
            Bson set = Updates.inc("seq", 1);

            Document doc = collectionSeq.findOneAndUpdate(query, set);
            System.out.println(doc.toJson());

            // 시퀀스 값 가져오기
            long seq = doc.getLong("seq");

            // 저장하기 위한 Document객체 생성 및 값 추가
            Document doc1 = new Document();
            doc1.append("_id", seq);
            doc1.append("name", obj.getName());
            doc1.append("point", obj.getPoint());
            doc1.append("regdate", new Date());
            doc1.append("professorno", obj.getProfessorno().getId());

            // DB에 저장하기
            InsertOneResult result = collection.insertOne(doc1);

            // System.out.println(result);
            if (result.getInsertedId().asInt64().getValue() == seq) {
                return 1;
            }
            return 0;
        }
        catch(Exception e){
            return -1;
        }
    }

    @Override
    public short update(Course obj) {
        Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
        Bson query2 = Filters.eq("_id", obj.getId());
        Bson query = Filters.and(query1, query2);

        Bson update1 = Updates.set("name", obj.getName());
        Bson update2 = Updates.set("point", obj.getPoint());
        Bson update = Updates.combine(update1, update2);

        UpdateResult result = collection.updateOne(query, update);

        if(result.getModifiedCount() == 1L){
            return 1;
        }
        return 0;
    }

    @Override
    public short delete(Course obj) {
        Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
        Bson query2 = Filters.eq("_id", obj.getId());
        Bson query = Filters.and(query1, query2);

        DeleteResult result = collection.deleteOne(query);
        if(result.getDeletedCount() == 1L){
            return 1;
        }
        return 0;
    }

    @Override
    public Course selectOne(Course obj) {
        try{
            Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
            Bson query2 = Filters.eq("_id", obj.getId());
            Bson query = Filters.and(query1, query2);

            Document doc = collection.find(query).first();
            if(!doc.isEmpty()){
                Course course = new Course();
                course.setId(doc.getLong("_id"));
                course.setName(doc.getString("name"));
                course.setPoint(doc.getInteger("point"));
                course.setRegdate(doc.getDate("regdate"));

                // 교수코드를 이용해서 DB에서 가져옴
                Bson query3 = Filters.eq("_id", obj.getProfessorno().getId());
                Document doc1 = collectionPro.find(query3).first();

                Professor professor = new Professor();
                professor.setId(doc1.getLong("_id"));
                professor.setName(doc1.getString("name"));
                professor.setRoom(doc1.getString("room"));
                professor.setRegdate(doc1.getDate("regdate"));

                course.setProfessorno(professor);

                return course;
            }

            return null;
        }
        catch(Exception e){
            e.getStackTrace();
            return null;
        }
    }

    @Override
    public List<Course> selectList(int page, String text) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<Course> selectList(Map<String, Object> map) {
        // TODO Auto-generated method stub
        return null;
    }
    
}


collection에서 private로 써봄

// 교과목 저장용
private MongoCollection<Document> collection = MongoConfig.create().getConnection("courses");
// 시퀀스 저장용
private MongoCollection<Document> collectionSeq = MongoConfig.create().getConnection("counters");

// 교수
private MongoCollection<Document> collectionPro = MongoConfig.create().getConnection("professors");


시퀀스 사용 db에 만들어 줄 것임.
사진 참고

db.counters.insert( {id :"SEQ_COURSE_NO", seq:NumberLong(100001)})

Impl에 시퀀스 끌고오기

private MongoCollection<Document> collectionSeq = MongoConfig.create().getConnection("counters");

 

 

example> service> CourseServiceImpl.java

insert

시퀀스 이용할때 _id 아님 id임 몽고디비 확인
시퀀스 impl에서 사용 방법

// 1. 값을 가져올 조건
Bson query = Filters.eq("id", "SEQ_COURSE_NO");
// 가져온 값 이후의 변경 조건
Bson set = Updates.inc("seq", 1);

Document doc = collectionSeq.findOneAndUpdate(query, set);


서비스를 써야하는 객체가 없다
그래서 만들도록함.

// 저장하기 위한 Document객체 생성 및 값 추가
Document doc1 = new Document(); // 객체 만들기
doc1.append("_id", seq);
doc1.append("name", obj.getName());
doc1.append("point", obj.getPoint());
doc1.append("regdate", new Date());
doc1.append("professorno", obj.getProfessorno().getId());


insert에서
professorno 교수키 넣을때 기본키만 넣어야함.

doc1.append("professorno", obj.getProfessorno().getId());



insert부분에서 professorno 부분
view에서 어떻게 받아오는지 생각해봐야함

 

view> CourseView.java

Professor을 선언해주고(professor 선언이유는 entity 타입 선언 때문)
불러온뒤 setProfessorno를 사용하여 배열[2]에 있는 숫자만 넣어줌.

// 이렇게 쓰는 이유는 entity> course에서 professor을 professor형태로 선언했기 때문임.
Professor p = new Professor();
p.setId( Long.valueOf(str[2]));
course.setProfessorno(p); // 교수자 정보(교수번호)



update

쿼리문 합치기 (Filters.eq , Filters.and)

Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
Bson query2 = Filters.eq("_id", obj.getId());
Bson query = Filters.and(query1, query2);


업데이트 합치기 (Updates.set, Updates.combine)

Bson update1 = Updates.set("name", obj.getName());
Bson update2 = Updates.set("point", obj.getPoint());
Bson update = Updates.combine(update1, update2);

 

수정

UpdateResult result = collection.updateOne(query, update);

 


selectOne

데이터 들고올때 아래 함수가 의미하는 것은 뭘까?
cursor?
iterator?
first?
교수코드를 가져오기 위해서 collectionPro를 만듬

private MongoCollection<Document> collectionPro = MongoConfig.create().getConnection("professors");


Professor 선언부터 중요 중요 중요 중요 중요 중요 중요 중요 중요 중요
교과목 쫙읽고
교수 정보를 들고와서 싸악 넣어서
나옴

@Override
public Course selectOne(Course obj) {
    try{
        Bson query1 = Filters.eq("professorno", obj.getProfessorno().getId());
        Bson query2 = Filters.eq("_id", obj.getId());
        Bson query = Filters.and(query1, query2);

        Document doc = collection.find(query).first();
        if(!doc.isEmpty()){
            Course course = new Course();
            course.setId(doc.getLong("_id"));
            course.setName(doc.getString("name"));
            course.setPoint(doc.getInteger("point"));
            course.setRegdate(doc.getDate("regdate"));

            // 교수코드를 이용해서 DB에서 가져옴
            Bson query3 = Filters.eq("_id", obj.getProfessorno().getId());
            Document doc1 = collectionPro.find(query3).first();

            Professor professor = new Professor();
            professor.setId(doc1.getLong("_id"));
            professor.setName(doc1.getString("name"));
            professor.setRoom(doc1.getString("room"));
            professor.setRegdate(doc1.getDate("regdate"));

            course.setProfessorno(professor);

            return course;
        }

        return null;
    }
    catch(Exception e){
        e.getStackTrace();
        return null;
    }
}





오후일과

menu5
map
키도 보관, 데이터도 보관하고 싶으면 map

else if(menu == 5){

    // 배열에 해당 순차적으로 데이터를 보관하는 용도
    // List<String> list = new ArrayList<String>();
    // list.add("데이터추가");

    System.out.print("ex)페이지,검색어(1,가나다) => ");
    String[] str = scanner.next().split(",");

    // 키와 값의 구조, 순차적데이터 아님.
    // 키가 중복되면 덮어쓰기가 됨.
    // Map => JSON => {"page":1, "text","검색어"}
    Map<String, Object> map = new HashMap<>();
    map.put("page", Integer.valueOf(str[0]));
    map.put("text", str[1]);

    List<Course> courses = courseService.selectList(map);
    for(Course course : courses) {
        System.out.println(course.toString());
    }

    // // 꺼낼때 서비스로 넣어줌
    // int page = (int) map.get("page");
    // String text = (String) map.get("text");
}




CourseServiceImpl.java
selectList

@Override
public List<Course> selectList(int page, String text) {
    Map<String, Object> map = new HashMap<>();
    map.put("page", page);
    map.put("text", text);
    return selectList(map); //다른메소드 호출하기
}

@Override
public List<Course> selectList(Map<String, Object> map) {
    try{
        // 꺼낼때 사용
        int page = (int) map.get("page");
        String text = (String) map.get("text");

        Bson query = Filters.regex("name", ".*" + text + ".*");
        Bson sort  = Filters.eq("_id", -1); // 과목코드 내림차순
        FindIterable<Document> list = collection.find(query).sort(sort).skip((page-1)*10).limit(10);

        List<Course> retList = new ArrayList<>();
        for(Document doc : list){
            Course course = new Course();
            course.setId(doc.getLong("_id"));
            course.setName(doc.getString("name"));
            course.setPoint(doc.getInteger("point"));
            course.setRegdate(doc.getDate("regdate"));

            // 교수코드를 이용해서 DB에서 가져옴
            Bson query3 = Filters.eq("_id", doc.getLong("professorno"));
            Document doc1 = collectionPro.find(query3).first();

            Professor professor = new Professor();
            professor.setId(doc1.getLong("_id"));
            professor.setName(doc1.getString("name"));
            professor.setRoom(doc1.getString("room"));
            professor.setRegdate(doc1.getDate("regdate"));

            course.setProfessorno(professor);

            retList.add(course);
        }
        return retList;
    }
    catch(Exception e){
        return null;
    }
}


regex 포함된 문자 찾기
Bson query = Filters.regex("name", ".*" + text + ".*");

selectList
아래에 쓰던 map 호출해서 써줌

@Override
public List<Course> selectList(int page, String text) {
    Map<String, Object> map = new HashMap<>();
    map.put("page", page);
    map.put("text", text);
    return selectList(map); //다른메소드 호출하기
}




추상화 클래스
클래스인데 인터페이스처럼 씀
service> ClassRoomService.java

package com.example.service;

import java.util.List;


// 추상화 클래스 => 구현, 변수성정등등 가능
// 인터페이스 => 구현x, 변수설정x

public abstract class ClassRoomService<T> {
    
    public abstract int insert(T obj);
    public abstract int update(T obj);
    public abstract int delete(T obj);
    public abstract List<T> selectList(T obj);
    public abstract T selectOne(T obj);

    public void myPrint1(){
        System.out.println("myPrint1");
    }
    public void myPrint2(){
        System.out.println("myPrint2");
    }
    public abstract void myPrint3();

    public void myPrint(){
        myPrint1(); // myPrint1
        myPrint3(); // 만드는 내용에 따라 출력
        myPrint2(); // myPrint2
    }
}



ClassRoomServiceImpl.java

package com.example.service;

import java.util.List;


// 추상화 클래스 => 구현, 변수성정등등 가능
// 인터페이스 => 구현x, 변수설정x

public abstract class ClassRoomService<T> {
    
    public abstract int insert(T obj);
    public abstract int update(T obj);
    public abstract int delete(T obj);
    public abstract List<T> selectList(T obj);
    public abstract T selectOne(T obj);

    public void myPrint1(){
        System.out.println("myPrint1");
    }
    public void myPrint2(){
        System.out.println("myPrint2");
    }
    public abstract void myPrint3();

    public void myPrint(){
        myPrint1(); // myPrint1
        myPrint3(); // 만드는 내용에 따라 출력
        myPrint2(); // myPrint2
    }
}


여기도 추상화할 수 있는데
추상화가 계속 하지말고, 끊어냄

public abstract class ClassRoomServiceImpl extends ClassRoomService<ClassRoom>

public class ClassRoomServiceImpl extends ClassRoomService<ClassRoom>

 

abstract를 또 붙여주면 추상화가 또 됨


설계를 할때
함수를 만들고
그 함수의 순서 같은 것을 만들때
추상화가 좋음.

 

print3또한 추상화라 impl로 작성

override로 myprint1가져와봄
super.myPrint1이 생김
수퍼 없애면 서비스에서 짯던 print1이 출력 안됨.
코드 추가하면 부모일 + 내가 시키고 싶은 일이 실행됨.

웹은 인터페이스 형식을 많이씀
안드로이드는 abstract를 많이 씀.(복잡)



실습

package com.example.service;

import java.util.List;

import com.example.entity.ClassRoom;

public class ClassRoomServiceImpl extends ClassRoomService<ClassRoom>{

    @Override
    public int insert(ClassRoom obj) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void myPrint1() {
        super.myPrint1(); // 부모의 일을 수행
        System.out.println("myPrint1에 추가된 기능");
    }

    @Override
    public int update(ClassRoom obj) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int delete(ClassRoom obj) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public List<ClassRoom> selectList(ClassRoom obj) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ClassRoom selectOne(ClassRoom obj) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void myPrint3() {
        System.out.println("BBBBBBBBBBB");
    }
    
}