programing

Java의 DAO(Data Access Object)

shortcode 2022. 12. 24. 21:54
반응형

Java의 DAO(Data Access Object)

요.DAO데이터 액세스 오브젝트임을 알게 되었습니다.게게 뭔지 ?가 가? ???

다른 종류의 소스에서 데이터에 액세스하기 위한 인터페이스라는 것을 알고 있습니다.제가 이 작은 연구를 하다가 데이터 소스 또는 데이터 소스 오브젝트라는 개념에 부딪혔을 때 머릿속이 복잡해졌습니다.

.DAO사용 장소와 관련하여 프로그래밍 방식으로 이루어집니다.떻게게사?사 용??이 개념을 가장 기본적인 것부터 설명하는 페이지에 대한 링크도 감사하게 생각합니다.

데이터 액세스 개체는 기본적으로 기본 데이터베이스 또는 기타 지속성 스토리지에 대한 액세스를 제공하는 개체 또는 인터페이스입니다.

이 정의는 http://en.wikipedia.org/wiki/Data_access_object 에서 취득합니다.

다음 사이트에서도 시퀀스 다이어그램을 확인하십시오.http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

간단한 예를 통해 개념을 이해할 수 있습니다.

종업원을 대표하는 엔티티가 있다고 합시다.

public class Employee {

    private int id;
    private String name;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

종업원 엔티티는 데이터베이스의 대응하는 테이블로 유지됩니다.종업원 엔티티를 조작하는 데 필요한 데이터베이스 조작을 처리하기 위한 간단한 DAO 인터페이스는 다음과 같습니다.

interface EmployeeDAO {

    List<Employee> findAll();
    List<Employee> findById();
    List<Employee> findByName();
    boolean insertEmployee(Employee employee);
    boolean updateEmployee(Employee employee);
    boolean deleteEmployee(Employee employee);

}

다음으로 SQL Server를 처리하기 위한 인터페이스와 플랫 파일 등을 처리하기 위한 인터페이스를 위한 구체적인 구현을 제공해야 합니다.

DATA ACCESS Object(DAO)란?

는 데이터 저장소의 데이터베이스에서 데이터에 액세스하는 데 사용되는 개체/인터페이스입니다.

DAO를 사용하는 이유:

데이터베이스와 같은 데이터 리소스에서 데이터 검색을 추상화합니다.
개념은 "데이터 리소스의 클라이언트 인터페이스를 데이터 액세스 메커니즘에서 분리"하는 것입니다.
 

데이터에 직접 액세스하는 경우의 문제는 데이터 소스가 변경될 수 있다는 것입니다.예를 들어, 애플리케이션이 Oracle 데이터베이스에 액세스하는 환경에 배포된다고 가정합니다.그런 다음 마이크로소프트 SQL 서버를 사용하는 환경에 배포됩니다.애플리케이션이 스토어드 프로시저와 데이터베이스 고유의 코드(번호 시퀀스 생성 등)를 사용하고 있는 경우, 애플리케이션에서는 어떻게 처리합니까?두 가지 옵션이 있습니다.

  • Oracle 대신 SQL Server를 사용하도록 애플리케이션을 다시 작성합니다(또는 차이를 처리하기 위한 조건부 코드를 추가).
  • 애플리케이션 로직 레이어와 데이터 액세스 레이어 사이에 레이어 생성

DAO 패턴은 다음과 같이 구성됩니다.

  • Data Access Object Interface: 이 인터페이스는 모델 객체에 대해 실행되는 표준 작업을 정의합니다.
  • Data Access Object 콘크리트 클래스 - 이 클래스는 위의 인터페이스를 구현합니다.이 클래스는 database/xml 또는 기타 스토리지 메커니즘이 될 수 있는 데이터 소스에서 데이터를 가져옵니다.
  • Model Object 또는 Value Object - DAO 클래스를 사용하여 검색된 데이터를 저장하기 위한 get/set 메서드를 포함하는 단순 POJO 개체입니다.

예를 참조해 주세요.

이것으로 DAO에 대한 이해가 풀렸기를 바랍니다!

DAO(Data Access Object)는 엔터프라이즈 애플리케이션에서 매우 많이 사용되는 설계 패턴입니다.기본적으로 모든 소스(DBMS, XML 등)에서 데이터에 액세스하는 데 사용되는 모듈입니다.다음과 같은 예를 읽어 보시기 바랍니다.

DAO의 예

원래의 DAO 패턴을 실장하는 방법은 다양하며, 작업을 단순화할 수 있는 프레임워크도 많이 있습니다.예를 들어 iBatis나 Hibernate와 같은 ORM(Object Relational Mapping) 프레임워크는 SQL 쿼리 결과를 Java 개체에 매핑하는 데 사용됩니다.

도움이 되길 바래, 안녕!

Data Access Object Pattern 또는 DAO 패턴은 API 또는 작업에 액세스하는 낮은 수준의 데이터를 높은 수준의 비즈니스 서비스와 분리하는 데 사용됩니다.Data Access Object Pattern 참가자는 다음과 같습니다.

Data Access Object Interface: 이 인터페이스는 모델 객체에 대해 실행되는 표준 작업을 정의합니다.

Data Access Object 콘크리트 클래스 - 이 클래스는 위의 인터페이스를 구현합니다.이 클래스는 database/xml 또는 기타 스토리지 메커니즘이 될 수 있는 데이터 소스에서 데이터를 가져옵니다.

Model Object 또는 Value Object - DAO 클래스를 사용하여 검색된 데이터를 저장하기 위한 get/set 메서드를 포함하는 단순 POJO 개체입니다.

샘플 코드는 이쪽입니다.

DAO와 ORM은 모든 언어에서 사용되므로 자바에 국한되지 않고 일반적입니다.

DAO를 이해하려면 먼저 ORM(Object Relational Mapping)을 이해해야 합니다.즉, "이름" 및 "age" 열이 있는 "person"이라는 테이블이 있는 경우 해당 테이블의 객체 템플릿을 작성합니다.

type Person {
name
age
}

특정 쿼리를 작성하는 대신 DAO를 사용하여 모든 사용자를 불러오는 대신 사용 중인 모든 유형의 DB(오류 발생 가능성이 있음)에 대해 다음 작업을 수행할 수 있습니다.

list persons = DAO.getPersons();
...
person = DAO.getPersonWithName("John");
age = person.age;

DAO 추상화는 사용자가 직접 작성하는 것이 아니라 사용하는 언어와 프레임워크에 따라 일반적으로 일부 오픈 소스 프로젝트의 일부입니다.

이제 본론으로 들어가겠습니다."..사용처.."일반적으로 복잡한 비즈니스 및 도메인별 코드를 작성하는 경우 DAO가 없으면 생활이 매우 어려워집니다.물론 제공된 ORM 및 DAO를 사용할 필요는 없습니다. 대신 추상화 및 기본 쿼리를 직접 작성할 수 있습니다.나는 그것을 과거에 한 적이 있고 거의 항상 나중에 후회한다.

Oracle 웹사이트에서 찾을 수 있는 가장 좋은 예(설명 포함)는 다음과 같습니다.여기서 또 다른 좋은 지도자를 찾을 수 있다.

너무 많은 설명으로 혼동하지 마세요.DAO: 이름 자체에서 오브젝트를 사용하여 데이터에 액세스한다는 의미입니다.DAO는 다른 Business Logic과 분리되어 있습니다.

봄 JPA DAO

예를 들어 엔티티 Group이 있습니다.

이 엔티티에 대해 저장소 Group Repository를 만듭니다.

public interface GroupRepository extends JpaRepository<Group, Long> {   
}

그런 다음 이 저장소를 사용할 서비스 계층을 생성해야 합니다.

public interface Service<T, ID> {

    T save(T entity);

    void deleteById(ID id);

    List<T> findAll();

    T getOne(ID id);

    T editEntity(T entity);

    Optional<T> findById(ID id);
}

public abstract class AbstractService<T, ID, R extends JpaRepository<T, ID>> implements Service<T, ID> {

    private final R repository;

    protected AbstractService(R repository) {
        this.repository = repository;
    }

    @Override
    public T save(T entity) {
        return repository.save(entity);
    }

    @Override
    public void deleteById(ID id) {
        repository.deleteById(id);
    }

    @Override
    public List<T> findAll() {
        return repository.findAll();
    }

    @Override
    public T getOne(ID id) {
        return repository.getOne(id);
    }

    @Override
    public Optional<T> findById(ID id) {
        return repository.findById(id);
    }

    @Override
    public T editEntity(T entity) {
        return repository.saveAndFlush(entity);
    }
}

@org.springframework.stereotype.Service
public class GroupServiceImpl extends AbstractService<Group, Long, GroupRepository> {

    private final GroupRepository groupRepository;

    @Autowired
    protected GroupServiceImpl(GroupRepository repository) {
        super(repository);
        this.groupRepository = repository;
    }
}

컨트롤러에서는 이 서비스를 사용합니다.

@RestController
@RequestMapping("/api")
class GroupController {

    private final Logger log = LoggerFactory.getLogger(GroupController.class);

    private final GroupServiceImpl groupService;

    @Autowired
    public GroupController(GroupServiceImpl groupService) {
        this.groupService = groupService;
    }

    @GetMapping("/groups")
    Collection<Group> groups() {
        return groupService.findAll();
    }

    @GetMapping("/group/{id}")
    ResponseEntity<?> getGroup(@PathVariable Long id) {
        Optional<Group> group = groupService.findById(id);
        return group.map(response -> ResponseEntity.ok().body(response))
                .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    @PostMapping("/group")
    ResponseEntity<Group> createGroup(@Valid @RequestBody Group group) throws URISyntaxException {
        log.info("Request to create group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.created(new URI("/api/group/" + result.getId()))
                .body(result);
    }

    @PutMapping("/group")
    ResponseEntity<Group> updateGroup(@Valid @RequestBody Group group) {
        log.info("Request to update group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.ok().body(result);
    }

    @DeleteMapping("/group/{id}")
    public ResponseEntity<?> deleteGroup(@PathVariable Long id) {
        log.info("Request to delete group: {}", id);
        groupService.deleteById(id);
        return ResponseEntity.ok().build();
    }    
}

데이터 액세스 개체는 데이터 원본과의 연결을 관리하여 데이터를 가져오고 저장합니다.데이터 소스에 대한 투과적인 액세스를 가능하게 하기 위해 비즈니스 객체의 기본 데이터 액세스 구현을 추상화합니다.데이터 소스는 RDBMS, XML 저장소, 플랫 파일 시스템 등의 데이터베이스입니다.

DAO는 3계층 아키텍처에서 "지속 관리자"와 같은 행위이며, "4대강" 책을 참조할 수 있는 패턴 설계도 DAO입니다.응용 프로그램 서비스 계층은 DAO 메서드의 숨겨진 세부 사항 및 내부 세부 사항을 알지 못하고 DAO 클래스의 메서드를 호출하기만 하면 됩니다.

dao classes는 jdbc 로직을 재사용하기 위해 사용되며 Dao(Data Access Object)는 설계 패턴입니다.dao는 JDBC 로직을 포함하는 단순한 Java 클래스입니다.

데이터 액세스 계층은 개별 비즈니스 로직 계층과 영구 계층에서 양호한 것으로 입증되었습니다.DAO 설계 패턴은 데이터 액세스 구현을 클라이언트로부터 완전히 숨깁니다.

Java Data Access Object(Java DAO)는 비즈니스 응용 프로그램에서 중요한 구성 요소입니다.비즈니스 애플리케이션은 거의 항상 관계형 데이터베이스 또는 객체 데이터베이스의 데이터에 액세스해야 하며 Java 플랫폼은 이 데이터에 액세스하기 위한 많은 기술을 제공합니다.가장 오래된 가장 성숙한 기술은 Java Database Connectivity(JDBC)를 사용하는 것입니다.API: 데이터베이스에 대해 SQL 쿼리를 실행한 다음 결과를 한 번에 하나씩 가져오는 기능을 제공합니다.

Pojo는 또한 프라이빗에서 정의된 특정 변수에 대해 getter와 setter를 만들 수 있는 Java의 Model 클래스로 간주합니다.여기서 모든 변수는 프라이빗 수식자로 선언되어 있습니다.

제 프로젝트 중 하나에서 겪은 작은 이야기로 제 나름대로 설명해 드리고 싶습니다.먼저 DAO가 중요한 이유를 설명하겠습니다.'DAO란 무엇인가?'를 참조하는 것이 좋습니다.

DAO?
중 한 내 in in in in in in in in in in, in in in in in in in in in in in in in in in를 사용했습니다.Client.class여기에는 시스템 사용자의 기본 정보가 모두 포함되어 있습니다.고객이 필요한 장소에서는, 필요한 장소에서 추악한 쿼리를 실시할 필요가 있습니다.그래서 가독성을 떨어뜨리고 많은 용장 보일러 코드를 만들었습니다.

후, 한 것은, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」QueryUtils.class를 추가할 수 .public static수식자에 액세스하면 모든 곳에서 쿼리를 수행할 필요가 없습니다.액티브한 클라이언트가 필요했을 때, 그냥 전화를 걸면 됩니다.

QueryUtils.findAllActivatedClients();

이렇게 해서 코드를 최적화했습니다.

하지만 다른 문제가 있었어!!!

Query Utils. 클래스는 매우 높은 성장세를 보이고 있다고 느꼈습니다.이 클래스에는 100개 이상의 메서드가 포함되어 있어 읽고 사용하는 것도 매우 번거로웠습니다.이 클래스에는 다른 도메인모델의 다른 쿼리(제품, 카테고리 위치 등)가 포함되어 있기 때문입니다.

그 후 슈퍼히어로인 CTO는 마침내 문제를 해결한 DAO라는 새로운 솔루션을 도입했다.DAO는 매우 특정 도메인이라고 느꼈습니다.예를 들어, 그는 DAO를 만들었습니다.ClientDAO.class어디든지Client.class관련 문의가 발견되어 사용하기 쉽고 유지보수가 매우 쉬워 보입니다.거인QueryUtils.class다른 많은 도메인별 DAO로 분해되었습니다.예를 들어 다음과 같습니다.ProductsDAO.class,CategoriesDAO.class코드 가독성, 유지보수성, 분리성높였습니다.

DAO가 뭐죠?

이것은 객체 또는 인터페이스로, 복잡하고 추한 쿼리를 매번 재사용 가능한 방법으로 작성하지 않고도 데이터베이스의 데이터에 쉽게 액세스할 수 있습니다.

언급URL : https://stackoverflow.com/questions/19154202/data-access-object-dao-in-java

반응형