Are JCR Nodes and Sling Resources the same thing accessed by different APIs?
Some developers would say 'Yes' and their solutions would work... sometimes. I've decided to write a post about it because I often see that people misunderstand Sling abstraction in relation to JCR.
Learning AEM usually starts with using CRXDE and a web browser to observe how changes made in a repository affect the resource tree and the site. Once you are familiar with CRXDE, you can start using Maven and a content-package plugin to produce FileVault packages which can be installed on AEM. Such packages may contain code, configurations, users, permissions and/or content. Once a package is installed, you can view it in the resource tree. Changes can be previewed in a web browser by entering a resource path with an extension (a default Sling GET servlet offers JSON, text and XML renderers mapped to .json, .txt and .xml extensions respectively).
So what's seems to be the problem here? From my experience, the main issue is with the lack of visibility of the resources other than JCR in the standard AEM tooling. You've probably heard the golden rule of the Sling community - "Everything is a Resource" a million times by now. The visible resources are sites, pages, assets, users, components, configurations, bundles... and all are in JCR. Hence it is natural to conclude that a Sling Resource is a JCR Node, well it is a wrong conclusion.