function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
둘의 차이는 safeMint의 경우 mint 하려고 하는 address가 실제로 존재하는지 체크 하는 로직이 구현되어있다.
_safeMint가 실행 되면 토큰이 전송된 후에 _checkOnERC721Received 함수가 호출되고 정상적으로 이루어지지 않을경우에는 트랜잭션을 되돌리게 됩니다.
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
Plain Old Java Object, 간단히 POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트라는 말로서 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용되게 된 용어이다(위키피디아)
POJO의 필수 요소로는 가볍고, 유연하고, 간단명료 함이 있다.
장점 :
특정 프레임워크에 종속되지 않은 프로그래밍.
모든 java 프로그램에서 사용이 가능하다.
특정 프레임워크에 종속되지 않기 때문에 테스트가 자유롭다.
규칙
멤버변수의 접근자는 private
멤버 변수마다 getter/setter 가 존재
getter/setter 메소드의 접근자는 public
POJO 클래스는 가독성과 재사용 성을 높이기 위해 객체를 정의하는 데 사용되므로 Bean과 유사합니다. Bean에는 몇 가지 제한이 있지만 POJO 파일에는 특별한 제한이 없다는 유일한 차이점이 있습니다.
JAVA POJO 예시코드
public class pojo {
private String name;
private String id;
private double sal;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
}
POJO vs Bean
Pojo에는 Java 규칙 외에 특별한 제한이 없습니다.
Java 규칙 이외의 몇 가지 특별한 제한 사항이있는 특수 유형의 POJO 파일입니다.
Bean에 비해 필드에 대한 제어가 적습니다.
필드에 대한 완전한 보호를 제공합니다.
POJO 파일은 Serializable 인터페이스를 구현할 수 있습니다. 그러나 필수는 아닙니다.
Bean 클래스는 Serializable 인터페이스를 구현해야합니다.
POJO 클래스는 이름을 사용하여 액세스 할 수 있습니다.
Bean 클래스는 getter 및 setter를 사용해야 만 액세스 할 수 있습니다.
필드에는 public, private, protected와 같은 액세스 수정자가있을 수 있습니다.
필드는 개인 액세스 권한 만 가질 수 있습니다.
POJO에서는 인수가없는 생성자가 필요하지 않습니다. 가질 수도 있고 없을 수도 있습니다.
인수가없는 생성자가 있어야합니다.
POJO 사용에 대한 불이익은 없습니다.
Bean 사용의 단점은 Default 생성자와 public setter가 불변이어야 할 때 객체 상태를 변경할 수 있다는 것입니다.