Video: IntelliJ IDEA Unlocked: The Features Top Engineering Teams Use That You Don’t – Yet | Duration: 4372s | Summary: IntelliJ IDEA Unlocked: The Features Top Engineering Teams Use That You Don’t – Yet | Chapters: Welcome and Introduction (11.44s), Speaker Introduction (123.59s), Understanding Code Productivity (278.005s), Dependency Injection Support (534.09s), Database First Approach (910.35s), Model-First Development (1120.525s), Database-Entity Syncing (1431.585s), Spring Debugger Plugin (1598.2s), Auto Database Connection (1808.87s), Visual Configuration Cues (1962.15s), Spring Debugger Features (2215.52s), Advanced Transaction Debugging (2499.57s), Remote Debugging (2751.545s), Database Tools (2998.845s), Kubernetes Deployment Management (3306.325s), Spring Modulith Overview (3589.36s), Debugging Features (3967.87s), Remote Linux Debugging (4037.195s), LinkedIn Sharing (4075.27s), IntelliJ Edition Features (4095.495s), Remote Debug Environments (4158.525s), Q&A Wrap-up (4186.055s), Flyway Migration Sequencing (4213.18s), Q&A Wrap-Up (4246.09s)
Transcript for "IntelliJ IDEA Unlocked: The Features Top Engineering Teams Use That You Don’t – Yet": Hi, everybody. How are you? Thank you for joining us today. What a nice turnout. My name is Nadia. I'm the head of business development for MENA. For those who don't know, we've been in MENA, in Dubai, in Saudi Arabia since 2025. So this is our second year. And we're here trying to deliver additional value to the MENA software development community. With me today is also my team that some of you might know. So thank you for the team to the team for organizing it. With that said, I would love to invite to stage my colleague, Sivar, the developer advocate, who will be speaking today on one of my most favorite topics that everybody is asking me in the community, with pretty much in the simple language sounds like, hey, guys. Your community version of IntelliJ is so wonderful. Why do we need the ultimate version? And I really do hope that Ceva helped answer that and also talk about why so many global leading teams such as Citi, Visa, BMW, NASA, and many, many more use IntelliJ Pro, for their software development needs. And hi, Siva, and thank you so much for joining us. I know it's a little bit late for you, in India, so thank you for accommodating us today. Thank you, Nadia. Thank you for inviting me, and it's a pleasure for, talking about my favorite software development tool. Wonderful. So I will leave, you with Siva and hope everybody enjoys the webinar. I know I will. Thank you. Enjoy, Siva. Hey. Let me share my screen. I hope you all can see my screen here. Give me a thumbs up. Yep. So, my name is Shiva. I am working as a developer advocate at JetBrains, and my main focus is on Java and IntelliJ IDEA. And, a little bit about myself, I have been working as a developer advocate for a few years, but before that, I have been working in, as a developer and architect and in various other roles for, around nineteen years. And, for many years, I have been sharing my knowledge, whatever I learned on my blog, on Twitter, and also I have a YouTube channel where I publish mostly, content around Java, Spring Boot, IntelliJ IDEA, and all those things. And, also, I have written few books, and this is about me. And this is what we are going to talk about in this, session. And, as Nadia mentioned, obviously, many people have, this question. Like, okay. We have intelligent AI communication. Why should I pay for, ultimate, addition? So this is what I'm going to talk about. And what really what is the value that ultimate edition is, giving for developers? If you, know recently in one of the conferences when we run a, poll, which, ID they are using most of these are our but choose, Intellisia idea, and there is a good reason for it. So in this session, I'm going to talk about what are those features that make developers pay for this ultimate edition and then how they're being more productive with, intelligent idea. So I want to cover all these topics, as I mentioned here, and I am pretty sure that you joined this session not to see these fancy slides, but to see in place idea in line. So, these are the slides I have. So don't worry about, being bored with these slides. So, I'm going to explore various features about IntelliJ IDEA and all that, and, this is the repository I have. I'm going to demonstrate, in this session. So if you want to clone later and then explore yourself, this is the, repository we have. And I'm going to share this in chat, so that you can, check it out later. So that with that, let's jump back to IntelliJ IDEA. So now if you think about software development, you know, developers are not getting paid to write code faster. They are getting paid to deliver software with high quality, and they are getting paid to deliver the features. So it is not all about how fast a developer can code. It is about how, a developer can become productive and deliver the business value. Now if you take a step back and think about what a developer typically do in a day, it is not most of the time, it is not writing code. It is about understanding the system. It is about exploring how the current system works, understanding what are the challenges we have, understanding what are the frameworks we are using in this particular system, and how different pieces fit together. We may be using our different tools like databases or, Docker, Kubernetes, and, we'll be using various frameworks. So a big part of our day to day work is understanding the system. So in this session, I'm going to talk about how IntelliJ IDEA helps you to understand your code base and helps you to, do your day to day work in a much more productive manner. And when we talk about Java development, most likely, you know, Spring Boot is the most popular framework. I mean, if any developer says I'm working on a Java application, there is a pretty good chance that they might be using Spring Spring Boot. And let's start with that. What are the things you can do, with Spring Boot and using IntelliJ IDEA and how IntelliJ IDEA is helping you to do it in a much more easier manner. Okay? So, we have all these things covered, so I'm going to go in a a little bit, faster. And let's start with how we can do some pretty cool things with, Spring Boot application. So here, I have opened my, simple Spring Boot application. And, if you open a spring component, which is a a spring service, let's say we have a typical controller service and repository layers, and we want to fetch some data from repository. And right now, I do not have a customer repository injected into my customer service. So how do I do this? So, typically, what we can do, we can inject like this private, customer repository. And okay. Let's go ahead and use auto void. So here, this is one way to inject the dependency. But if you see, there is a a yellow squiggly line that says there is something wrong with this code, and IntelliJ immediately shows field injection is not recommended. So this is one of the inspection IntelliJ IDEA provides so that you can write in a better cleaner code. So, okay, there is something wrong, but how do I fix it? There is option enter, which shows, possible quick fixes. In this case, instead of using, auto void annotation using a field injection, it is recommended to use construction injection. So if I click on this quick fix, it automatically turns this into a, final field with a constructor injection. Pretty neat. So e one, this is nice, but what is even more nice, you know, here, you don't let's say you are working on this implementation of this find all customers. Instead of coming here, usually, you want okay. Now in this space, I want to have the reference to customer repository. Now let's say imagine you have a bunch of code, you need to scroll up, and then here you type all the, dependencies and all those things. You don't have to do that. Instead, start typing the dependency you want to inject, and IntelliJ IDEA will show, okay. Now, customer repository is one of the bin that matches with, whatever string you type and just press enter. It takes care of automatically creating a dip, the dependency and auto wiring that through constructor. So you don't have to jump up and down to inject the dependencies. So this is one of the very common activity that, Spring Boot application developers do. So, we made it very easy. You don't have to jump up and down and then, start typing. Start injecting the dependencies that you want to use, and IntelliJ IDEA will take care of the rest of the things. So this is one of the thing. And what other things we do commonly? Like, we do log. Right? Like, if you ever worked in a production based application, you know the importance of having logs. Right? Let's say I want to log what is the ID, what is the customer we want to find, and we want to log the ID of the customer. Again, you can go up and then top, type a logger, log equal to log, factory, all that thing. Right? But you don't have to do that again. Start typing log, and based on the dependencies you have, it will automatically show what are the loggers that possibly you can inject. In this case, I have SLF for j. So it shows, there is a logger, you can inject. And if I simply press, it will automatically create a log instance like this. So these are the nice things that you can, do where you don't have to type a lot of things. And if you simply learn these nice little features, and it will make you more, productive. And when many people ask, what is the one thing that, makes you more productive? Usually, in any tool, it is not one thing that makes you more productive. Instead, there are 100 small small things all combined together makes more developer experience very pleasant. So in this case, we just saw how easy it is to inject a dependency, how easy it is to, create a logger. So similarly, there are few other things. Let's say we have scheduled jobs here, and, we have a a scheduled job, and we have configured a cron expression that explains when to run this job. So here, this is what we have written, which in human readable way that represents every minute. So, earlier, we used to copy this, go to a website where, we can explore what does this cron expression means, and then we can understand. Now we don't have to do this. Let's say you change it to this. So here, it immediately reflects, okay. This job is going to execute for every hour at minute one. So this is the kind of things. There are a lot of such small small features that overall, combinedly helps developers to understand the code base in a very easier way. Similarly, let's say, we have some asynchronous processing jobs here. And right now, we are not returning anything. Let's say this method, we want to return some kind of, object. In this case, let's assume we want to return an instance of customer. And immediately, IntelliJ shows you a warning that says, method annotated with async should return either white or something like a future like object. So you don't have to, write this and then run the application, and then it will fail saying that, okay, you are not supposed to, return objects like this. Either you should return white, return some future. So immediately, IntelliJ IDEA shows, okay, this is there is something wrong. So the feedback cycle is very quick. You can simply change it to, okay, I'm going to return a future of our customer. So this is very important because the quicker the feedback cycle, the more productive you are. Like, you don't have to, type something and then run the application, and then two minutes later, you get to know, okay, I can't simply return a customer object. I need to return a future or a white. Your ID instantaneously telling you that. So it is very important to understand and, use this framework features. That's that's how IntelliJ IDEA is helping. These are all the framework fit specific features that will make you more productive, but there is a chance that you might not properly understood them, or you might miss some of the, concerns. This is where IntelliJ IDEA is showing that, hey. You are doing this wrong by showing this inspection. And wherever it is possible, there is a quick fix to automatically, solving those issues. So and one of the nice feature, with IntelliJ IDEA. So in Spring Boot application, typically, we configure various things. Let's say database connection properties or our application specific, properties something like this. So when we are configuring these properties, it is very hard to remember all these properties names. Right? Like, Spring Boot itself provides a lot of, starters, and each starter comes with various, properties, and it is next to impossible to remember all those property names. So luckily, with IntelliJ IDEA, providing excellent support for Springboard, you don't have to remember any of those things. Let's say I want to configure, database connection properties. So now I can start typing, and then it will automatically show, properties matching with whatever the key I am typing. Even better, if you already know the key of the, property, you can simply start typing the first letter of the key. For example, if I want to configure data source username, I can simply say spring dot data source dot username. It automatically, figures out this could be the property that you want to configure. Similarly, if I want to configure, password, you can do this. So you can, you don't have to remember all these properties, and, it it is not possible at all. So this is where, IntelliJ IDEA jumps in and offer you a helping hand. So these are the, fundamental, features that helps in your day to day, work. So now now let's go one step further. And many of us work on, database driven applications. So, either we can, start in a database first manner where you think about the application you are going to build, and, you design the database schema and then work your way towards implementing the business logic. That is database first approach. Or you might start with model first approach where you don't think about the database design that you leave it, to the end. First, you focus on your, designing the models and then, designing the behavior. And then, at the end, you, come up with a database design that suits your application needs. So either way, IntelliJ provides support for it. So let's start with checking first how IntelliJ IDEA can help you if you are, if you are following database first, design. So in this, Spring Data JPA, DB First, this is a Spring Boot application where we have a Flyway database database migration script. So in this case, we are using a Flyway database migration tool, but the same feature is, what's fine with, Liquibase as well. So here, we do not have a JPA database entities, but, we have Flyway database migration script. So now I'm going to start the application, which is going to automatically so here, we configured to use Docker Compose, which is going to use a PostgreSQL database. So it is going to start the PostgreSQL container and automatically, run these scripts. So let's take a look at the database here. We have all these tables. Now that we have the tables, we can go ahead and, create, JPA entities for users, books, and reviews and all that. But, again, this is where IntelliJ IDEA helps you so that you don't have to manually create all these entities. Instead, you can simply right click on it, create JPA entities from database, and here, it will automatically show you all the prop all the database tables. So select okay. Here, you can choose which properties you want to, keep in your entities. So here, I want to have this many to one association to user, and, also, I want to have the reviews. So selecting all these properties, you can change if, any data type you want to change, and you can choose which package you want to, generate the entities in and click okay. So here, IntelliJ IDEA is going to take care of inspecting the database structure and automatically create the entities. So here we have user entity, review entity, and book entities, and it takes care of all the, properties, which one is not null, and all those things. So, these are the things where you don't need to spend time on writing code. This is where you can leverage whatever IntelliJ IDEA is already providing. These reverse engineering capabilities helps you a lot, so that you don't have to spend your valuable time on, writing code. Instead, you can leverage IntelliJ IDEA and generate these things. So this is fine. But what about the other way around? Like, what if I have the domain model, but I I haven't yet, decided on, creating our database migration scripts. And how do I do that? So let's go ahead and check how that workflow, would look like. So here I have another application, model first application. So in this case, let's take a look at. In this case, we have JPA entities, but we do not have any migrations created. So we started with creating models and probably creating repositories and all those things. Now, we, think our application comes to a decent stage, and we want to, decide on, okay. Let's go and use five a for database migrations. So how do we do that? So, again, you don't have to go ahead and create this migration scripts manually because you need to remember, okay, if you are using MySQL, is it bull or bullion for bullion type database? Is it, Postgres? And what do we call, is it a bullion? So you don't have to remember all these tiny details. Instead, you offload all that to, figure out to, Intellize the idea. So here, what we can do, let's say let's start the application, and, it is going to again use Docker Compose and spin up a post Haskell instance. And right now, we do not have any migrations. So the database is empty. So let's take a look at it. We don't have any entities, but, because we have Flyway dependency added, Flyway schema history table is created. Now, we have the entities. We do not have any, migration scripts. So how about click here, and as this is our first migration script, click on Flyway, init migration. Okay? So now it you choose what is the source because we are starting with the models. So select model, and you can choose what is the database. In this case, we are using PostgreSQL. And, also, you can choose one entity or, you can choose for all the entities you want to create the, flywheel migration scripts. So click okay, and it is going to inspect all the entities, and it is going to come up with the script based on the, how you define your JPA entities. It is going to, create a flyby migration script. So let's say we want to, name it as v one init dot SQL. Okay? So now we have created our first migration script. Let's go ahead and restart the application. Spring mode is going to take care of automatically applying these migrations and creating all those tables. So here you can see all the tables are created. Fine. But either way, whether you choose DB first or model first, it is not going to be like once you create the entities and, migration scripts and then it will be there forever. You keep evolving these, things. Right? So how about adding, or, how about adding a a new property? So here, in addition to, existing, fields, let's say I want to add one, phone field. Okay. So now how do I, sync it? Let's say I want to create a new migration, and I want to add this column to the database. So, again, you don't have to do it manually. Instead, you can click here and click Flyway migration, and it will check, okay, what is the source? Here we check, source system model, and this is the database, connection. And if you click okay, it is going to compare your models with the database schema and figure out that delta is phone. So we have newly added this property in user, so we need to add this column in the database users table. So you can just, give it a name and generate it. So like this, you don't have to, remember all this, syntax and everything. Instead, you can leverage the IDE capabilities and provide all these, you can delegate all these grant work to the ID. So here, whether you start with the DB first or model first, and, you can generate the other things. Like, if you start with the database first, you can generate the entities. Or if you start with the migrations first, you can generate entities. And in in the other way, if you start with the models first, you can choose to generate either Flyway or Lookbase. So we have, support for both of them. So it is up to you. Both are supported. In addition to that, let's say we make database change first. Sometimes you decide that, okay, I know what are the changes I want to make to the database. So let's go ahead and create a Flywheel migration, v three. Add, address. Let's say. And let's go and copy this. Okay. So we have the third migration, which is not yet applied. Let's restart, which is going to automatically apply, to the database. So here, if you again take a look at the database, in users, we have address column, but our entity doesn't have the address column. So how do we sync it? Again, don't do it manually. Instead, you can leverage create JPA entities from DB. And here, if you check okay. Users. So here you can see which columns are not yet mapped. So either you can check here and click okay. It is going to generate, I mean, it's going to add this address property. That is one way to do it. And even more simpler, if you know the column name which is added, you can simply start typing a d d r. IntelliJ IDEA is going to figure out, okay, this is, linked to users table and there is a column that is not yet mapped. So it is automatically show this, address column. And if you, press tab, it is going to automatically add this and also add this setters and caters for it. So, either way, you start with the database or model. You make changes to entities or database. You can sync in both ways. So this is very handy. And imagine if you are, if any of your team member is new to, JPA or Spring Data JPA and all that, and they don't need to spend time on manually creating all these. Instead, they can focus on the semantics and how the, JPA functionality works. Leave all the groundwork and these repetitive coding tasks to simply, to integrate the area, which takes care of all these creating the schemas and syncing both the ways. So this is how it can, it can take care of all the, boilerplate work and, this typing. You don't have to do that already. So now that we have seen how IntelliJ IDEA can help in building database driven applications, let us move towards more interesting thing, which is debugging. If you ever look at, senior developers, and you might have seen sometimes, like, they just stare at their screen, and they don't do anything. They don't type or they don't, click on here. They just stare at their screen, and that is what they do in their mind. Like, they try to make sense of, okay, how this thing is working and how Spring Boot is automatically figuring this thing out. So all that knowledge of how Spring Boot works is most of the times rely in, senior developers' minds. But the same thing, if you, ask it to do, to a junior developer, they need to figure out, okay. I I configured this, but it is not reflecting here. I added this annotation, but somehow, the component is not, loaded. So they, struggle a lot to understand the implicit behavior of the framework, in this case, Spring Boot. So this is where, Spring Debugger plug in comes in, where it can unpack all the magic, Spring Boot is doing behind the scenes and clearly show you, okay. This is what you configure, and this is how it is behaving. And this is been, this been is loaded here because of so and so reason. So you can already just, take a visual cue and understand that what is happening. So you don't have to go into the, satellite mode to figure out why it is not working and all that. So now let us go ahead and explore what do I mean by that. So let me open Spring Debugger demo. So one of the, boring but mandatory thing most of the, developers do, still SQL databases is one of the most commonly used database, systems. So here, these days, most of us are using, okay, most of us are using various types of SQL databases and NoSQL databases for different purposes and all that. But still, I would say rDBMS is most widely used databases. And many times we want to, register a database connection so that we'll get auto completion for all the column names and table names and all those things. One of the challenge is, let's say, if you, if you want to create a database connection, first, you, spin up the containers and then come here and manually create a connection, providing all these connection properties and everything. That is one way. But if you are working on multiple microservices or something like that, you need to take care of, port conflicts. Like, if you are running multiple PostgreSQL instances, you may need to bind to a different port so that you won't have any port conflicts. But there is another way where you don't map it to a fixed port on the host, but the thing is every time you start the application, it is going to, map it to a random available port on the host. Then the problem is every time you have to figure out which port it is mapped to, and then you need to upgrade the connection, which is very tedious and very annoying. So, this as this is one of the common frustration for, Springboard developers, IntelliJ IDEA makes it easy by, using this, a Spring Debugger plug in. So what, Spring debugger do? If you are using either docker compose or test containers to spin up the docker, any databases, it will automatically detect the data source and automatically register a connection here so that you don't have to worry about core conflicts or anything else. So in this application, it's a Spring Boot application using Spring Modulate, and we are using, docker compose. So here, if I simply, let's say, start the application in debug mode, remember this. If you start in a normal mode, spring debugger is not in effect. But if you want to leverage all this spring debugger capabilities, you should start in debug mode. When you start the debug mode, it is going to, first spin up all the containers. In this case, we have postgres, we have release, and we have mail bit. So it is not to spin up all these containers. But if you remember, earlier, we do not have any connection registered manually. But when you start the application, it automatically figured out, okay, we have a new database connection, started, and it automatically figured, okay, the host port is five six eight four five, and then automatically registered the database connection. So which is very, very handy, especially when you are working with multiple, microservices. Otherwise, you keep on exploring, okay, what port I am using for service a so that I map to a different port. Now you don't have to worry about all that. So right now, you don't, you get this support for, SQL databases and, MongoDB. If you like this feature, please raise a request for more, support for more databases like Redis, Kafka, things like that. So, let me know what is the other services that you want to, have this kind of a support. So if you take a look at the number of data sources IntelliJ supports, it is kind of overwhelming. Here you can see all the list, and, also, there are a whole bunch of other things. So let us know what is the other type of databases you want to have this kind of a support. As I said, right now, we have all the SQL databases and PostgreSQL, this automatic database connection registration. Okay. Cool. So now that we have the connection automatically established, what else a spring debugger plug in, give us? So let's go ahead and take a look at. So if you see here, only application dot properties file is kind of active, and there are other profile properties. Like, there is a local profile and, Kubernetes profile, but they are kind of, disabled because we have not enabled, these profiles. So they are not loaded. So to give a a visual cue that these properties files are not loaded, you can clearly you don't have to debug and then check the logs and all that. You can clearly just take a look at it and see, okay. These profile properties are not loaded. It is as simple as that. And, also, not only properties file, even if you have configuration classes or any other components, here, Flyway config is disabled. It's a spring configuration class, but this is only enabled when you activate local profile. But right now, we have not activated, local profile. So here you can get a, a clear visual cue that this configuration is not loaded. Similarly, if you have, let's say, orders and, notification. So here, we have a email service interface, and there are two implementations of it. One is, registered based on the property. So here, if app email service type is, having sorry. Is having the value Java mail, then this class is going to be registered. But if the same property value is console, then console logging email service is going to be registered. So we are registering a bin conditionally based on the property value of it. So as you can see clearly, it is giving a a a visual cue that this is not loaded based on the current configuration because this value is set to, Java mail. And here you can see this Java mail component is loaded because this is matching with the, current configuration. So like that, you can just take a look at it and then, understand what components are loaded, what configuration is loaded, and, you don't have to dig through the logs and then verify it. Another, another important information that you can just get taking a look at the code when you start the application. Let's say, here in orders, events. So here, let's take a look at this order event anchor. So here, we have injected email service and application properties. And when you start the application in debug mode, here right away in the inlay information, you can see which instance of email service is injected. Right here, we can see it's an instance of Java, mail service. Similarly, you can see which instance of this application properties is injected. So, usually, if you have many such interfaces and dynamically you add, some jar where you provide one one type of application, one type of implementation, you may need to figure out, okay. I configured in a different profile. What kind of, implementation is injected? You you don't have to do this all by yourself. You can just, take away, that information right looking at here. So it is, kind of a very easy to understand how your application is assembled and what kind of a implementations is injected. All that information is shown right away in your ID itself. So this is, another way we try to, clearly communicate to the developers how your application is configured and what kind of a bins are loaded. But, again, there is more to it. Right? Like, when we start the application and it is not behaving the way we expect, and, of course, we need to debug the application. So let's take a look at, what kind of a debugging options spring debugger plug in provides. So here, we have various endpoints. And by the way, there is a HTTP client, feature provided by IntelliJ IDEA where you don't have to use external tools like, Postman or something else. IntelliJ IDEA itself provide HTTP client. So here, you can just use, whatever the endpoints you want to call. And let's say I want to invoke this API endpoint. And if I click on it so I have already set a our debug point here, and, we are in a product controller, and you can just debug through it. And from product controller, we, went into product service. And here, if you take a look at it, there is a cacheable annotation, which means we are going to run this for the first time, and then we cache the result. Based on the, given code, we are going to cache the the result. Let's click on it so we get the response. So here, if you take a look at our tools so here we get the response. But what happens if you try to invoke the same API endpoint again? So this time, again, you got the reference, you got the breakpoint in controller. But if you try to proceed, you won't hit the breakpoint in the product service because we are using the same code, but this method is already cached. So you won't get into this logic. Let's say what if there is something wrong in the implementation of this method. I want to debug through it. One option is you some way, you have to invalidate the cache and then restart the application and, or try to invoke the same API endpoint and do this all. But this is where, spring debugger comes into picture. Now, typically, when you try to debug, so here, let's say, you hit this breakpoint and what kind of, values you have access in the scope. So, basically, you have the, reference of product controller and all the product service. So these are the things you have reference. So here we have product service reference. But what if I want to access, cache manager, which is registered by the Spring framework, and I want to invalidate the cache so that I will get the control into this method, and, I will be able to debug the issue here. But how do we access it? So earlier, you might have to inject a cache manager here and then call the cache manager dot invalidate, and then, you may able to debug that issue. But, of course, that is not really a great way to do it. So this is where Spring debugger comes into picture. Even though we do not have access to other bins that are not injected here, Spring debugger helps you to access any spring bin that is in the application context. Not only the bins that are here, you can access any bin. For example, product repository is not injected, that is not in the scope, but still here you can access a product repository. And let's say find out. So here you can access and when you invoke this method, you can see, okay, this is all the data we have. And not only the bins that are created by us, you can access any bin even registered, by Spring Framework itself. So there is a cache manager bin, and, I can get the cache of product by code, and I can invalidate it. So here now I am invalidating the cache. Now I if I proceed, now even though that method is, method result is already cached, I have invalidated it, and then I am able to proceed to, product service method. Now maybe whatever I want to debug, I can debug. So the point being, if you want to debug any spring boot issues, you have the option to access any spring bean. Even though the bean is not injected in the current scope, you can access any spring bean. This is really, really powerful if you want to, if you want to debug complex issues. So another very cool feature, provided by, Spring Boot is you can track where does a database transaction starts, where does a database transaction ends, and, are we in a nest transaction? So you can debug all that information. For example, right now, we are in this method, and as you can see, we have a transactional here. And if you take a look at here, it shows we we are currently running in a transaction. And if you click here, it will take you to where the transaction started, and you can also see what are the, attributes of the transaction. Is it a read only transaction? Is it a read write? What is the isolation? What is the propagation behavior? And within this transaction, what are the objects that are already loaded into, l one cache of hibernate. So you can get all this information. So here, let's proceed. Not only a simple use cases, even the advanced use cases, you can, check out. Let's go to, request. So here, let me invoke an API endpoint to create a a new order. So here, when I click, we come to order service in which we have already, started a transaction, and we have persisted, some entities, order and other items. So here you can see there is already a database transaction started. And now if you proceed further, what we are doing, we are calling inventory service and adjusting the inventory levels, and let's proceed. So within inventory service, we are performing some logic, but in a a separate transaction. So we are, we are temporarily suspending the current transaction and starting a new transaction here. So we can see all that information. Here, current transaction is is in inventory service, but before that, there is a parent transaction started in auto service. You can, check all that hierarchy as well. So let's proceed. And in this process, we published an event, auto created event, and our, asynchronous event handler catches this. And now here, because we are starting a new transaction, you can see this new transaction is started in, auto event handler. Okay? So like that, you can track where does a particular transaction started, where does it end, where it is is it running in a nested transaction? So things like that, you can just track all that information through Spring debugger features. And by the way, one more really handy features is, IntelliJ IDEA has a bunch of inspections configured to, to let the developer know if you are following any kind of a bad practices or if there is any better way to handle it. We have already seen that with, field injection. When we used auto wide, field injection, it suggested this is not recommended and also, provided an option to convert that into constructor injection. So here, similarly, we are, seeing this, yellow swiggly line that shows, okay, there is something, wrong. And, by my mouse overing it, we can see, event listener declaration can be simplified with application module listener. So in this application, I am using spring module hit. And instead of handling, events in a synchronous, fashion like this, there is a much simpler way which we can use application module listener. So it is as simple as that. So not only, providing all these options, it is kind of, educating the developers if there is any better way, to handle or implement the logic. So we can get all these inspections and recommendations to write a better code. And one more very, painful and tedious process is a remote debugging. So if you are familiar with this process of, okay, you build the application and then you package it, be it a Docker container, jar, whatever, and then you deploy it on a remote server, and, there is something wrong. It is not working. So how do you debug? So many times, you take a educated guess, and then you make, changes accordingly, and then you deploy, and then try to replicate the same scenario. And, again, it is not working. And you repeat this cycle over and over again, and it is very, very frustrating. So, being able to remotely debugging is very, very handy. So in this application, let's say, I have some, utility where I can start the application in a Docker container. Okay. Let's go ahead. Task restart. So what I'm doing, I am deploying this spring debugger demo application in a docker compose. So, all the dependencies like database and application, everything, it is going to run on our Docker Compose. But how do I do debug it? So what we can do when we are deploying this, if we enable the debug options. So here, I configured the agent to, run on debug port 5,005. So once I configured that and start the application, I have also exposed that port onto my local. So once I have this settings configured, now I can let's take a look at okay. The application is started. Let's go ahead and quickly verify whether I am able to access it or not. Okay. So I get the data. So application is running fine on, Docker containers. So how do I debug this? If I have some issue with one of the endpoint I want to, debug it, how do I do it? So this is where remote debugging comes into picture. So let's say, here we can go, and there is remote JVM debug option. So here, I can say, bookstore, remote debug. And here you can take what are the values you configured and, if you are running on multi module, you can choose which module you want to attach the debug session to and then debug it. So now we have established a remote debugging session, from IDE to our Docker container. So now we have that. Let's say, invoke this API endpoint, and still you get all the features as if you are running the application locally. So, typically, in many, companies where they have a centralized, integration server where people can deploy their applications remotely, and then it's a kind of a development environment where they can attach the debuggers and all that. But, typically, it is not allowed in production, of course. So in this integration environments, it is very easy to, deploy your application and then attach your local IDE to, remote, running services, and you can debug through it. So you have all the options as I have already shown. You can access all the SpringBeans. You can access, any of the built in components like entity manager. You can access entity manager. Or if you want to access, environment, you can access that. In addition to that, you also have option to evaluate, properties. What is the address for page value? So you can check all that. So even if the application is running remotely, once you able to establish this remote, debugging session, you have all the features that are available as if you are running your application locally. So we have seen the spring debugger features. Now what else, Java developer can, explore and use IntelliJ IDEA for? As I already mentioned, it is not all about writing code. As I mentioned, like, you work with various types of services, be it a database, be it a Docker, be it Kubernetes, be it, release or whatever the services you have. Then you usually, work with multiple things. And in most of the applications, you have a database and you have to do a lot of, exploring and, let's go ahead and stop this. Let's start this. So here, if you if you want to ever perform various types of actions on a database, you might, probably try to use any, database specific clients, but you don't have to. Let me stop this. You don't have to because IntelliJ IDEA provides very powerful database tools where you can perform a lot of operations, with the database. For example, you want to connect to a remote database or a local database and you want to run ad hoc queries, you want to generate as we have already seen, you can generate entities and all that. But beyond that, let's say you are running an application on, staging environment or dev environment, and you want to, compare the diffs between your dev environment to staging. So IntelliJ, provides this database tools where you can perform all those actions. Let's, take a look at couple of those features. So here again, when I start the application, it automatically connected to the database, and I can see all these, tables. So here, you can check, let's say, you can compare these tools. Let's so here, if you take a look at, if you want to compare some, tables, you can select the table and compare with our different database and different schema, and you can compare, okay, are they same? Are are there any, differences? You can compare that. And, also, if you want to kind of generate some diagrams of your, schema, you can click on it, and you can see, all the tables are, represented here and also what is the relationships. You can get all this information right away. In addition to that, let's say you want to let's go ahead and open a SQL session. So here, let's say, you want to run some complex, so here I'm just using very simple, SQL. So here you can execute queries and all that, but if you have any complex queries that you want to analyze, so here there are few options like if you want to explain what is the, query it is running and how it is performing based on the, indexes it is created and you want to analyze the plan. So all these features are already available in database tools. You don't have to, rely on any third party tools. In addition to that, there are various nice utilities that you could, explore. For example, if you want if you have an existing database and you want to generate some SQL scripts for it, let's say insert, let's say select all those. So it will generate the corresponding query. But if you want to take a backup of, import and export export data to a file. So here, there are a wide range of options available for you. If you want to create insert scripts, you can do that. If you want to create it as a update scripts, or if you want to export it as a CSV file, or if you want to export it as, let's say, JSON, you have the options. So there are various options available. You can if you want to explore data to various file formats, there is a very easy way to do it. So if you are working with databases, you should definitely check out what are all the features that are available in database tools. Really, there is literally as you explore more and more, it feels like you are not using IntelliJ IDEA full or to its full extent. So now that we have seen, various features, how about deployment? Is there any features that IntelliJ helps me to understand, with Kubernetes deployment? In recent versions, we have improved, support for Kubernetes deployment where if you want to iteratively work on okay. You create Kubernetes manifest and you want to deploy it, and, you you might want to explore. Okay. This is how I deploy a part. This is how I deploy, our deployment. So things like that. So it becomes very easy. Currently, I have a, Kubernetes cluster running on my Docker desktop. So here I have, a bunch of Kubernetes manifest. Now I want to deploy this on my cluster. So what can I do? Here, if I have multiple, clusters, I can select what cluster I want to, deploy to, and also you can select which namespace you want to, deploy to. So if you click, it will automatically take care of applying this into the cluster. Now you don't have to again go for a separate tool to check, what are the objects that are deployed on the Kubernetes cluster. In the IntelliJ IDEA itself, you have everything on your fingertips. So here, in this case, we have deployed a configuration and config map. So here, we have all these values. We can see what is the value of each of these properties, and there are secrets. We can check what are the, secrets available, and if you want to get, what is a specific value, you can get all that. So now that we have deployed the configuration, let's go ahead and deploy PostgreSQL database as well. So okay. We have deployed PostgreSQL database, and we can check, is the part ready? So here we can see is pod still trying to, deploy and it is not yet ready. It is still showing as unhealthy. And meanwhile, if you want to check the logs, if you click here, you can see. So for the people who are a CLI savvy, fine. They can go and do all this from, their terminals. But for people like me who want to click on, buttons and then get the information what they want, this is really, very, handy. So here, if I want to get the logs or if I want to, open a console, if I want to SSH into the container, you can do all that right from your ID itself. So now that we have deployed PostgreSQL database, let's go ahead and apply this as well. And, also, let us check. This is deployed. Finally, let us deploy our application as well. Okay. So it is going to deploy. Fine. It is running. Now how do I access it? Unless you are using some, port mapping and, again, that is another, headache, annoying thing. But this is where, again, intelligence support comes very handy with let's say, first, if you want to connect to the, PostgreSQL part, you can come here and you can do port forwarding. I want to forward, port forward the container port onto my host. Let's proceed. So now I have mapped the port. Now I'm able to directly connect to it as well. So it is as simple as that. You don't have to, fiddle with various, commands and all that. You can just couple of clicks and then you are able to connect to the, PostgreSQL database. Similarly, if you want to connect to your application, again, go ahead and forward the application port, and your, port is mapped to local host eight zero eight zero. Let's go ahead and see if we are able to access it. So we are still be able to access the application that is running on the, Kubernetes cluster. So it is as simple as that. You don't have to fiddle with any of the commands and all those things. Click and then you are able to talk to the service that is running in a Kubernetes cluster. So this is how simple it made your day to day activities. So, any questions on this so far we have? So finally, I would like to talk about one of the recent highly recommended practice while building, spring, applications that is using spring modulate. So earlier, we went all the way up to microservices, and then we burned our hands, and then we realized not every company needs microservices that is very expensive to maintain. But we don't want to even go back to building module, monolith as well because that is another, another edge where it is very difficult to maintain monolith applications. So we, thought of what if we are able to build modular monoliths. So here, spring modulate helps us to build this modular monoliths where each of the package we can maintain as if it is a separate module, and we can selectively allow other modules to talk to it. We don't have to expose everything. So IntelliJ IDEA provides, again, supporting this spring module. If you take a look at it, so this is the main entry point class, and this is considered as the root package. And within this root package, each of these packages are considered as a module. And as you can see, all of them are kind of a give a, lock icon with green, green lock icon. And if you expand that, you can see the nested packages are having a red closed icon, which means they are private part of the catalog module. Similarly, if you have any other module here, these are all private modules, which means no other module can directly access any of the components within these packages. So, though it is technically that is how it works, but earlier, we had to figure out, how it internally works and all that. But IntelliJ IDEA makes it very explicit. Like, by just taking a look at it, you can see, okay, these are all the modules we have. And within the, package, we have this public class, which means this is a public component that can be accessed by other modules, but these are the private components. So we cannot access directly any of this prop any of these components from other packages. So by giving this visual cues, it really helps, understand. For example, this is a private component. So here, this product service is within the domain, which is a private component to the catalog module. What happens if I try to, inject it? Let's say, in other controller, I want to directly inject a private final and product service. So here, it shows module orders depends on non exposed type, product service. So you don't have to first write it and then try to, run the application and then get to know that, okay, you are not supposed to access product service. As you type, it automatically tells you that, no, you are not allowed to access the internal component of the, catalog model. So that's how IntelliJ helps you as you type. It will automatically let you know that you are not supposed to do this. So, these are the inspections we have, and, it will automatically reflect. For example, even though domain is a private component, within that, we have a model package, and then we enabled, it has a named interface. So any of the classes within this model can be accessed by other components. So right away, looking at this package structure, you can easily understand what is a public accessible components and what are the private components of it. So this is how IntelliJ, helps you to visually understand. Not only that, if you want to explore what are the modules you have and all that, if you open the main entry point component and open the structure tool window, Here you can see what are all the available modules you have and what are the named interfaces it exposes and all that information you can see right away. So that is, all I would like to cover. But now I would like to take any questions and okay. Great. But, before going to q and a, I would like to ask you to, you know, check out the survey that is shared in the, comments here. And, please take a look at the survey, fill the survey, and give us the information like how you are using our JetBrains products and what are the features that you like, what are the features you want to, want us to build for you. And please help us, and we'll, provide more better features. And, also, based on the information you provide as part of this feedback, you will, you probably win, IntelliJ IDEA ultimate licenses as well. So please fill the service. Helps us. Okay. Now I'm going to take a look at the, questions, and I will try to answer them. Okay. Does this works for Kotlin as well? Yes. Whatever features I have shown will also work for Kotlin as well. So, basically, these are the two most popular JVM based languages, Java and Kotlin, and all the features that I have shown, equally works well with Kotlin language as well. Okay. Is it possible to debug SQL code with IDEs, DB tools, plugins? So when you say let's share this. Is it possible to debug? So I think so. Here, if you are debugging I mean, when you say debug, if you want to run a SQL command and then, try to debug Or if you want to run through the application and then try to figure out, is it, is it debug through some SQL database query and all that, that I have to check. But from the application point of view, yes, you can check out what is the query that is being run and is it, I think there is an initiative to automatically verify if you are not having any indexes and, if you want to alert based on that. That is there is some discussion, but I'm not sure whether we have that feature yet. This is where I would like your feedback. Like, what is the feature you are looking for when you say, is it possible to debug? Please create an issue and try to raise a request. Okay. What is the feature you are looking for? That will help us. Okay. Let me what about remote debugging on application running on Linux server without Docker? So here, I showed an example of, running an application on Docker Compose. But if you are running, any Spring Boot application on remote Linux machine, whatever machine, as long as you provide that, there are two options where you attach a remote debugging with the port and it is accessible, from your local machine, you can, do the remote debugging. So that works fine. I want to ask, is it, let me I want to ask, is it okay to share on LinkedIn what I have learned? Absolutely. And we would love to, allow you to do that. Does the kJPA entities from DB option available in the free version? No. These features are, available in ultimate edition. And one more thing I would like, I would like to tell you. So previously, we have both, community edition and, ultimate edition has two different distributions. But from IntelliJ IDEA version twenty twenty five point three, there is a single distribution where you don't have two different installations and all that. You have only one distribution. And once you install, if you want to enable ultimate, you just, give the license and you unlock all the features available. But if you do not have ultimate license, it will act like a communication. So there are no two distributions right now. And, all the features that I have demonstrated, especially Springboard support and all that, the those switches are available in ultimate edition. Does remote debug works in any environment like UAT? Is there any limitation like, connection? So as long as those containers are those servers are reachable from your local machine, it works. So there is no limitation as long as you are able to establish a connection to those, computer and databases, whatever. Does JetBrains educational pack has, IntelliJ IDEA, ultimate features? I think so. But I'm not 100% sure, but most likely, yes. I think there are couple of similar questions regarding, does remote debug, can we do, like, UAT? I already answered. How does it take care of v one in its sequel is executed before v two? So the question is how does the scripts fly via migrations executed in the other v one, v two? So, basically, this is the functionality by Flyway. It has nothing to do with the IntelliJ. So Flyway figures out the version numbers and all that and then execute them in a sequence. So it is a Flyway feature. What are the various enable okay. So this is what are the various enabled plugins in JetBrains Intelligence idea where it came for connected GitHub repos scans and detect a parallel Kotlin script functions mixed with GCP artifact registry. I'm sorry. I I couldn't understand this. Maybe raise a question somewhere else. Right now, I don't know. I do not fully understand the question. Sorry. So I think these are all the questions we have. Cool. So if you have any other questions or you would like to know any other feature, I'm happy to answer. K. Okay. So I hope I have answered, most of the questions. And, once again, thank you for joining the session. It is I hope at least, you learned some of the new features. And as someone asked, we are very happy if you want to share, what, new tricks you learned in this session on LinkedIn or any other social media platforms. Once again, thank you for joining the session.